Git の履歴を書き換える | git reflog
git reflog コマンド
Git には reflog という機能があり、ブランチの先端や HEAD の更新を追跡できる。これにより、どのブランチやタグからも参照されなくなった状態にも戻れる。履歴を書き換えた後でも、reflog にはブランチの過去の状態が記録されているため、必要に応じてそこへ戻れる。
使い方
git reflog
ローカルリポジトリの reflog を表示するコマンドである。
git reflog --relative-date
「2 週間前」のような相対日付形式で reflog を表示するコマンドである。
補足説明
現在の HEAD が更新されるたび、たとえばブランチの切り替え、履歴の書き換え、または単に新しいコミットを作成した場合などに、reflog へ新しい項目が追加される。
使用例
git reflog を理解するために、1 つの例を見てみよう。
0a2e358 HEAD@{0}: reset: moving to HEAD~2
0254ea7 HEAD@{1}: checkout: moving from 2.2 to master
c10f740 HEAD@{2}: checkout: moving from master to 2.2
上の reflog では、まず master から 2.2 という名前のブランチへチェックアウトし、その後 master へ戻っている。続いて reset により古いコミットへ移動している。reflog は最も新しいログを上に表示し、HEAD@{0} というラベルを付ける。
reset が意図しないものだったとしても、2 つのコミットを取り消す前に HEAD が指していた元のコミット 0254ea7 の情報は reflog に残っている。
git reset --hard 0254ea7
したがって、git reset コマンドを使って、master を過去に存在したコミットへ戻すことができる。この意味で、reflog は履歴を書き換えるときの安全網として機能する。
また、変更がローカルリポジトリにコミットされている場合にだけ reflog が安全網になること、そして reflog は HEAD の移動だけを記録していることも覚えておこう。