그게 나다. 오늘 그랬다. 오늘 작업을 완료 했는데(심지어 파일이 10개나 되었다) 실수로 작업한 것들을 날렸다. 스터디 카페에 있었는데 울고 싶었다.
이전 커밋으로 되돌릴 때 이전 커밋 앞에 있는 모든 커밋들은 사라지는 git reset --hard
명령어 때문이었다.
멘탈이 나갔지만, 정신을 가다듬고 사라진 커밋을 복구할 해결 방법을 구글에 검색해보았다.
Reflog는 HEAD의 상태가 변하거나 HEAD가 참조한 branch의 상태가 변할 때를 추적하고 기록으로 남긴다. 그렇다면 무엇이 HEAD의 상태와 HEAD가 참조한 branch의 상태를 변화시키는 것인가?
다음 명령어들이 git reflog가 추적하는 것들이다.
git commit
git reset
git checkout
git merge
git rebase
git cherrypick
git pull
git reflog와 사용하기 위한 명령어는 다음과 같다
git reflog show HEAD
git reflog show HEAD
명령어와 같은 역할을 하지만 짧은 명령어는 다음과 같다.
git reflog
git reflog
명령어를 실행시키면 커밋 기록 뿐만 아니라 브랜치 업데이트 되는 상태까지 출력이 되는데 다음과 같은 화면이 나온다.
HEAD@{숫자}
(0부터 시작) - 가장 작은 숫자가 가장 최신의 기록이다.reset
, commit
, checkout
- git reflog가 추적하고 기록한 git 명령어들이다.내가 오늘 겪었던 일은 다음과 같다.
HEAD@{5}
- 내가 작업하고 커밋한 내역이다.
HEAD@{4}
- 착오로 git reset --hard
를 써서 작업한 커밋을 날려먹었다.
날려먹은 커밋을 복구하기 다음과 같은 명령어를 실행했다.
git reflog # 사라진 커밋 기록 가져옴
git reset --hard <SHA hash> # 사라진 커밋 복구
HEAD@{0}
- git reset --hard 70b4011
로 사라진 커밋을 복구하였고 없어져버린 10개의 파일도 그대로 복구가 되었다..
git reset --hard를 잘못 쓴 덕분에 git reflog라는 것을 처음 알게 되었고 정말 유용하게 쓰게 될 것 같다.
[출처]