undo git --amend
출처 : How to undo “git commit --amend” done instead of “git commit”
새로운 commit으로 작성해야 하는데 실수로 --amend
옵션으로 작성해서 덮어씌워지는 경우가 있다. 이 경우에 아래의 명령어로 되돌아갈 수 있다. (단, 직전 명령어가 git commit --amend
인 경우이다)
$ git reset --soft HEAD@{1}
돌아가는데 사용된 방법은 reflog
를 사용하는 것이다.
예를 들어 아래의 commit들이 쌓여있는 상태라고 보자.
$ git log --pretty=oneline
1a410efbd13591db07496601ebc7a059dd55cfe9 third commit
cac0cab538b970a37ea1e769cbbde608743bc96d second commit
fdf4fc3344e67ab068f836878b6c4951e3b15f3d first commit
잘못해서 네 번째 commit을 --amend
로 작성했다고 하면 git log
는 세 번째 commit이 사라진 상태로 보인다
$ git commit --amend -m "fourth commit"
484a59275031909e19aadb7c92262719cfcdf19a fourth commit
cac0cab538b970a37ea1e769cbbde608743bc96d second commit
fdf4fc3344e67ab068f836878b6c4951e3b15f3d first commit
이 경우 git reflog
를 사용하면 사라진 세 번째 commit이 HEAD@{1}
에 나타난다
$ git reflog
484a592 HEAD@{0}: commit (amend): third commit(2)
1a410ef HEAD@{1}: commit: third commit
cac0cab HEAD@{2}: commit: second commit
fdf4fc3 HEAD@{3}: commit: first commit
이 때 HEAD@{1}
의 의미는 reflog
라는 것으로 git의 HEAD
가 변경될 때마다 남는 로그이다. 흔히 쓰는 git log
를 사용하면 보이지 않으나 git log -g
혹은 git reflog
를 사용하면 볼 수 있다.
commit --amend
를 통해 HEAD
가 변경되었으므로 reflog
가 남게 되며 이 reflog
로 reset --soft
를 사용해 돌아갈 수 있는 것이다.
더 자세한 reflog
에 대한 내용은 Git의 내부 - 운영 및 데이터 복구의 '데이터 복구' 탭을 참고하면 된다.