git reflog으로 제거된 커밋 복원하기
실수로 커밋을 제거했다면 어떻게 해야 할까요? Git 은 HEAD 포인터에 대한 모든 변경 사항을 reflog라는 특수 로그에 기록합니다. 이것이 여러분의 안전망입니다. 이를 사용하여 손실된 커밋을 찾고 복원할 수 있습니다.
reflog 를 확인하여 방금 다시 작성한 히스토리를 찾아봅시다.
git reflog
수행한 작업 목록이 표시됩니다. rebase (finish): returning to refs/heads/master라고 표시된 줄을 찾으십시오. 바로 아래 항목, 아마도 HEAD@{1}은 리베이스 이전의 브랜치 상태를 나타냅니다.
a5b4c3d (HEAD -> master) HEAD@{0}: rebase (finish): returning to refs/heads/master
1e2d3f4 HEAD@{1}: rebase (start): checkout HEAD~3
...
git reset --hard를 사용하여 브랜치를 이 이전 상태로 복원할 수 있습니다. 이 명령은 파괴적이므로 커밋되지 않은 변경 사항을 모두 삭제하므로 주의해서 사용하십시오.
이 경우 HEAD@{1}인 리베이스 이전 상태로 브랜치를 리셋해 봅시다.
git reset --hard HEAD@{1}
리베이스가 시작되기 전의 커밋으로 HEAD가 이동했음을 확인하는 메시지가 표시됩니다.
HEAD is now at 1e2d3f4 Revert "feat: Add file2.txt"
이제 마지막으로 로그를 확인하십시오.
git log --oneline --graph
리베이스 이전의 히스토리가 표시되어야 합니다.
* f461400 (HEAD -> master) Revert "feat: Add file2.txt"
* acea45c chore: Add last-commit file again
* c04b3f5 docs: Update documentation in file1
* 9403080 feat: Add file2.txt
* ee39412 feat: Add file1.txt
"fix: Add a temporary file that should be removed" 커밋은 여전히 존재하지 않는다는 점에 유의하십시오. 이것이 올바른 것입니다! git reset --hard HEAD@{1} 명령은 인터랙티브 리베이스가 시작되기 전의 상태로 복원한 것이지, 커밋을 제거하기 전으로 복원한 것이 아닙니다. 인터랙티브 리베이스는 해당 원치 않는 커밋을 히스토리에서 성공적으로 제거했습니다. ls를 실행하여 bad-commit-file.txt가 여전히 존재하지 않는지 확인할 수 있습니다. reflog는 Git 에서 실수로부터 복구하는 데 매우 유용한 도구입니다.