- reflog(参照ログ)とは HEAD やブランチ先端の動きの履歴
- 各個人のローカルリポジトリに存在
- ブランチの切り替え、新たに加えられた変更のプル、履歴の書き換え、あるいは単なる新規コミットの実行などを記録
git reflogで HEAD の移動履歴を、git reflog <ブランチ名>でそのブランチ先端が指していたコミットの一覧を確認可能HEAD@{5}: HEAD の五つ前の状態を示す
$ git reflog
d22bfa0 HEAD@{0}: commit (amend): Add the contens of poem-c
8c9300c HEAD@{1}: commit: Add the contens of poem-c
6a67f31 HEAD@{2}: commit: Add empty poem-c
f7c3605 HEAD@{3}: reset: moving to @^
...
git log -gでgit log風の出力で reflog が見られるgit show HEAD@{5}でも確認可能
- 間違えて意図と異なるコミットへ
git reset --hardして、必要なコミットを失った場合git reflogかgit log -gで reflog を見る- 失ったコミットがあれば、
git reset --hard HEAD@{<n>}でそのコミットへ HEAD を移動できる git branch recover-branch HEAD@{<n>}すれば、そのコミットが先端のブランチを作成できる
現在、master が次のようなログだとする。
af3cfdd Add d.txt
d8441e3 Add c.txt
aefb89f Add b.txt
2dace69 Add a.txt
間違えて git reset --hard @^^ しちゃう。さらにターミナルとかをすべて閉じてしまって、もとの HEAD のハッシュ値もわからない。すると、ログは次のようになる。
aefb89f Add b.txt
2dace69 Add a.txt
そのままでは d8441e3 より先に戻れないので、reflog を使う。
$ git reflog
aefb89f HEAD@{0}: reset: moving to @^^
af3cfdd HEAD@{1}: commit: Add d.txt
d8441e3 HEAD@{2}: commit: Add c.txt
aefb89f HEAD@{3}: commit: Add b.txt
2dace69 HEAD@{4}: commit (initial): Add a.txt
直前に reset したことや、それ以前に commit していたことがわかる。
af3cfdd に戻りたいので、次のコマンドを叩く。
$ git reset --hard HEAD@{1}
すると、HEAD がaf3cfdd に戻る。
$ git log
af3cfdd Add d.txt
d8441e3 Add c.txt
aefb89f Add b.txt
2dace69 Add a.txt