Posts [Git] git reset --hard 되돌리기 (feat. git reflog)
Post
Cancel

[Git] git reset --hard 되돌리기 (feat. git reflog)

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가지가 있다. 차이점은 그림에 잘 나타나 있지만, 텍스트로도 짚고 넘어가자.

git_reset_options

--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이 복구된 모습을 확인할 수 있다.

References

This post is licensed under CC BY 4.0 by the author.