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 の移動だけを記録していることも覚えておこう。