git checkout이용해 특정 commit으로 되돌리기
git checkout [commit hash] 를 통해 특정 commit으로 되돌릴 수 있다. 이때 [commit hash]는 모든 해시값을 써도 되고 앞 7자리 해시 값을 써도 된다.
git checkout [commit hash]
git checkout 예시
예를 들어 git log가 다음과 같은 경우 log의 커밋들 중 fourth commit으로 되돌리고 싶다고 해보자.
commit f0cdce562bef70fed30f392a18c82543aa2f126b (HEAD -> main)
Merge: 027f7aa 1709310
Author: Seyoung Cho <seyoungcho2@gmail.com>
Date: Wed Jan 5 23:51:57 2022 +0900
merge commit
commit 027f7aa0b6a2c917543b8643f6238c83ff9169f2
Author: Seyoung Cho <seyoungcho2@gmail.com>
Date: Wed Jan 5 23:31:56 2022 +0900
fifth commit
commit 1709310d63be62eeb48182032b6e64580994ef4c (feature-layout)
Author: Seyoung Cho <seyoungcho2@gmail.com>
Date: Wed Jan 5 23:31:10 2022 +0900
fourth commit
이때 우리는 [commit hash] 값에 "1709310d63be62eeb48182032b6e64580994ef4c" 을 써도 되고 "1709310"을 써도 된다.
git checkout 1709310d63be62eeb48182032b6e64580994ef4c
git checkout 1709310
*git log --oneline을 사용하면 아래와 같이 커밋해시가 7자리로 나온다. 맨 왼쪽의 값이 commit hash값이다.
f0cdce5 (HEAD -> main) merge commit 027f7aa fifth commit 1709310 (feature-layout) fourth commit
HEAD commit으로 돌리기
우리는 git checkout HEAD 명령어를 통해 HEAD commit으로 변경사항을 되돌릴 수 있다.
git checkout HEAD
이것이 가능한 이유는 .git 폴더의 HEAD 파일이다. git은 .git 폴더의 HEAD파일에서 HEAD의 커밋 해시값에 대한 메타데이터를 저장하고 있다. 만약 git 명령어에서 HEAD를 사용하면 HEAD가 해당 커밋 해시값으로 치환되기 때문에 위의 명령어는 실제로 다음과 같이 동작한다.
git checkout [HEAD commit hash]
*만약 .git 폴더에서 HEAD 파일을 어떻게 인식하는지 궁금하다면 아래 글을 참고하길 바란다.
HEAD commit에서 n개 이전 커밋으로 되돌리기
우리는 git checkout HEAD~n 명령어를 이용해 HEAD commit에서 n개 이전 커밋으로 되돌릴 수 있다.
git checkout HEAD~n
예를 들어 아래와 같은 git log가 있는 경우를 생각해보자.
commit f0cdce562bef7012fe4f392a18c62543aa2f126b (HEAD -> main)
Merge: 027f7aa 1709310
Author: Seyoung Cho <seyoungcho2@gmail.com>
Date: Wed Jan 5 23:51:57 2022 +0900
HEAD commit
commit 027f7aa0b6a2c917543b8643f6238c83ff9169f5
Author: Seyoung Cho <seyoungcho2@gmail.com>
Date: Wed Jan 5 23:31:56 2022 +0900
fifth commit
만약 fifth commit으로 커밋 해시를 되돌리고 싶은 경우 HEAD로부터 1개 전이므로 다음과 같은 명령어를 사용할 수 있다.
git checkout HEAD~1
특정 파일만 특정 커밋으로 되돌리기
우리는 git checkout [commit hash] [file name] 을 이용해 특정 파일만 특정 커밋으로 되돌릴 수 있다.
git checkout [commit hash] [file name]
예를 들어 아래와 같은 커밋이 있다고 해보자.
➜ GitFolder3 git:(main) ✗ git log --oneline
f0cdce5 (HEAD -> main) merge commit
027f7aa fifth commit
1709310 (feature-layout) fourth commit
d8ebc87 (feature-view) third commit
4c7e3dd second commit
1bb1b52 first commit
aa파일만 second commit(4c7e3dd)로 돌리고 싶다면 다음과 같이 작성하면 된다.
➜ GitFolder3 git:(main) git checkout d8ebc87 aa
Updated 1 path from 4dbbe18