문제 발생
git reset --hard나 rebase 뒤 작업한 커밋이 git log에서 보이지 않습니다. commit object가 즉시 삭제됐다고 단정하기 전에 local reference가 어디를 가리켰는지 확인해야 합니다.
reflog는 local repository의 ref 이동 기록이며 remote나 다른 clone과 자동 공유되지 않고 만료 정책의 영향을 받습니다.
원인 분석
git log는 현재 branch에서 도달 가능한 history를 보여 주지만 reflog는 HEAD와 local ref가 이동한 기록을 보관합니다. reflog는 기본적으로 로컬 저장소 자료이므로 다른 clone이나 remote 복구 기록으로 기대하면 안 됩니다. 만료나 garbage collection 뒤에는 object가 남아 있지 않을 수도 있습니다.
git status
git reflog --date=iso
git show --stat <candidate-sha>
해결 방안
후보 SHA의 내용과 부모를 확인한 뒤 현재 branch를 바로 움직이지 말고 복구용 branch부터 만듭니다.
git branch recovery/lost-work <candidate-sha>
git log --oneline --decorate recovery/lost-work
git diff main...recovery/lost-work
필요한 commit만 원래 branch에 merge하거나 cherry-pick합니다. 복구 전 작업 트리에 변경이 있다면 먼저 안전하게 보관하고, 확인되지 않은 SHA를 대상으로 다시 reset --hard를 실행하지 않습니다.
공식 문서
reflog 보존 기간과 object 정리 설정은 저장소마다 다를 수 있으므로 실제 설정을 확인합니다.