Git Reflog: 失われたコミットを復元する
git reflog を使って失われたコミットの復元、誤った rebase の取り消し、削除したブランチの復元を行う方法を解説。Git における究極のセーフティネットです。
git reflog詳細な説明
git reflog は何をするのか?
git reflog(参照ログ)は、ローカルリポジトリでブランチの先端が変更されるたびにその記録を残します。コミットの祖先をたどる git log とは異なり、reflog は HEAD の移動(reset、rebase、checkout、削除されたブランチ上のコミットも含む)を追跡します。
Reflog が重要な理由
git reset --hard を実行したりブランチを削除したりすると、それらのコミットは git log から消えたように見えます。しかし Git は即座にガベージコレクションを行いません。reflog はデフォルトで少なくとも90日間、これらの「孤立した」コミットへの参照を保持します。
Reflog を表示する
git reflog
# 出力:
# a1b2c3d HEAD@{0}: reset: moving to HEAD~3
# f4e5d6a HEAD@{1}: commit: Add payment validation
# 7g8h9i0 HEAD@{2}: commit: Update user model
失われたコミットを復元する
# reflog でコミットハッシュを見つける
git reflog
# 失われたコミットを指す新しいブランチを作成
git branch recovered-work f4e5d6a
# または現在のブランチをそのコミットにリセット
git reset --hard f4e5d6a
削除されたブランチを復元する
# ブランチの先端がどこにあったか確認
git reflog | grep "checkout: moving from feature-x"
# ブランチを再作成
git branch feature-x <hash>
誤った Rebase を元に戻す
rebase がうまくいかなかった場合、reflog で rebase 前の状態を見つけてリセットします:
git reflog
# rebase 開始直前のエントリを見つける
git reset --hard HEAD@{5}
制限事項
reflog はローカル専用であり、リモートや共同作業者とは共有されません。また git gc によるガベージコレクションの対象にもなります。重要な復元作業は迅速に行いましょう。reflog はローカルのアンドゥ履歴と考えてください。強力ですが、適切なバックアップの代替にはなりません。
ユースケース
開発者が誤って git reset --hard を実行して3つのコミットを失った場合に、git reflog でコミットハッシュを見つけて失われた作業を復元する場面で使用します。