Introduction
git commit을 하다가 이전 commit으로 돌아가고 싶을 때, 주로 git reset --hard HEAD~1
를 사용한다.
(이때, --hard
는 다른 옵션들과 달리 파일 내용을 완전히 삭제시키기 때문에 주의해야 한다.)
git reset은 정말 필요할 때 사용하기 때문에 git reset 이전으로 되돌릴 일이 거의 없으나,
실수로 옵션을 잘못 주는 경우에는 git reflog
로 commit log를 확인하여 git reset 이전으로 되돌린다.
이번 포스팅을 통해 commit을 git reflog로 확인하고, git reset –hard 이전으로 되돌리는 방법을 알아보자.
git reset <option>
git reset에 줄 수 있는 옵션은 3가지가 있다. 차이점은 그림에 잘 나타나 있지만, 텍스트로도 짚고 넘어가자.
--hard
git log --oneline
으로 commit log를 확인한다.
1
2
3
4
$ git log --oneline
ab43d66 (HEAD -> master) docs: Update README.md
1fd1a15 docs: Update README.md
fb58071 docs: Update README.md
git reset --hard HEAD~1
을 하고, 다시 commit log를 확인한다.
1
2
3
4
5
6
$ git reset --hard HEAD~1
HEAD is now at 1fd1a15 docs: Update README.md
$ git log --oneline
1fd1a15 (HEAD -> master) docs: Update README.md
fb58071 docs: Update README.md
git status
로 working directory, stage의 상태를 확인한다.
1
2
3
$ git status
On branch master
nothing to commit, working tree clean
파일 내용이 완전히 삭제되어 working directory, stage 어디에도 남아있지 않은 것
을 확인할 수 있다.
--mixed
git log --oneline
으로 commit log를 확인한다.
1
2
3
$ git log --oneline
1fd1a15 (HEAD -> master) docs: Update README.md
fb58071 docs: Update README.md
git reset --mixed HEAD~1
을 하고, 다시 commit log를 확인한다.
1
2
3
4
5
6
$ git reset --mixed HEAD~1
Unstaged changes after reset:
M README.md
$ git log --oneline
fb58071 (HEAD -> master) docs: Update README.md
git status
로 working directory, stage의 상태를 확인한다.
1
2
3
4
5
6
7
8
9
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: README.md
no changes added to commit (use "git add" and/or "git commit -a")
파일 내용이 유지되어 working directory에 남아있는 것
을 확인할 수 있다.
--soft
git log --oneline
으로 commit log를 확인한다.
1
2
3
$ git log --oneline
2d54abb (HEAD -> master) docs: Update README.md
fb58071 docs: Update README.md
git reset --soft HEAD~1
을 하고, 다시 commit log를 확인한다.
1
2
3
4
$ git reset --soft HEAD~1
$ git log --oneline
fb58071 (HEAD -> master) docs: Update README.md
git status
로 working directory, stage의 상태를 확인한다.
1
2
3
4
5
6
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: README.md
파일 내용이 유지되어 stage에 남아있는 것
을 확인할 수 있다.
git reflog
🤔 이미 --hard
로 파일 내용을 삭제했는데, 특정 commit으로 되돌아가야 한다면 어떻게 해야 할까?
😏 git reflog
로 모든 commit log을 확인하고, git reset
에 commit hash 값을 주어 되돌리면 된다!
git reflog
로 모든 commit log를 확인한다.
1
2
3
4
5
$ git reflog
0bc79e7 (HEAD -> master) HEAD@{0}: reset: moving to HEAD~1
8d9ea8f HEAD@{1}: commit: docs: Update README.md
0bc79e7 (HEAD -> master) HEAD@{2}: commit: docs: Update README.md
:...skipping...
git reset --hard <특정 commit hash 값>
을 하고, 다시 commit log를 확인한다.
1
2
3
4
5
6
7
$ git reset --hard 8d9ea8f
HEAD is now at 8d9ea8f docs: Update README.md
$ git log --oneline
8d9ea8f (HEAD -> master) docs: Update README.md
0bc79e7 docs: Update README.md
fb58071 docs: Update README.md
특정 commit으로 git reset이 되돌려진, 즉 commit이 복구된 모습
을 확인할 수 있다.