git reflog(reference log)는 HEAD와 브랜치가 가리킨 위치가 바뀐 기록을 시간순으로 보여준다. git log가 커밋 사이의 부모-자식 관계라면, reflog는 "내가 언제 어디에 있었나"의 기록이다.
- commit, checkout, reset, merge, rebase, pull, cherry-pick, amend처럼 HEAD를 움직이는 거의 모든 작업이 남는다
HEAD@{n}은 n번 전의 HEAD 위치다. 그대로 명령에 넣을 수 있다- 로컬에만 있고 푸시되지 않는다. 기본 설정에서 도달할 수 없는 항목은 30일, 도달 가능한 항목은 90일 뒤 만료되고
git gc(garbage collection) 때 정리된다
git reflog -10
# 0c17a91 HEAD@{2}: reset: moving to HEAD~3
git reset --hard HEAD@{2} # 잘못한 reset 이전으로
git branch restore 0c17a91 # 또는 브랜치로 살려 두고 살펴보기reflog에도 없을 때
stash를 지웠거나 reflog가 정리된 뒤라면 어디에서도 참조하지 않는 커밋(dangling commit)을 직접 찾는다.
git fsck --no-reflog | awk '/dangling commit/ {print $3}' \
| xargs -L1 git --no-pager show -s --format="%ci %H" | sort
git show <해시>:path/to/dir/ # 내용 확인
git branch restore <해시> # 브랜치로 되살리기git stash apply <해시>는 stash 형태의 커밋에만 통하므로, 일반 커밋은 브랜치를 만들어 꺼낸다. reset --hard나 리베이스가 무섭지 않은 이유가 이 안전망이다. 원인 커밋을 찾는 일은 git bisect로 원인 커밋 찾기가 맡는다.
출처: git-reflog 문서