「ローカルブランチを git branch -D で誤って消去してしまった」「git reset --hard HEAD~1 を実行したら、まだプッシュしていない大切なコミットが消えてしまった」。Gitを使っている開発者であれば、誰しも一度はこのような血の気が引くような操作ミスを経験したことがあるのではないでしょうか。
通常の git log コマンドでは、削除されたブランチや失われたコミットのハッシュを辿ることは困難です。しかし、諦める必要はありません。Gitには操作ログの最後のセーフティネットである git reflog が備わっています。
本記事では、git reflog を使って誤って削除したブランチやコミットを救出する具体的な手順を解説します。
1. git reflog とは?
git reflog(Reference Log)は、ローカルリポジトリ内でHEAD(現在の作業場所)が指し示した位置の変更履歴をすべて記録しているログシステムです。
通常の git log が「コミット同士の親子の歴史(ツリー)」を表すのに対し、git reflog は「あなたがローカルで実行したGitコマンドの足跡」を時系列順に記録しています。
これには以下の操作も含まれます。
- チェックアウト(ブランチの切り替え)
- コミットの作成 / アメンド
- リセット(
git reset) - マージ / リベース
- プル / フェッチ
この操作ログは、Gitのガベージコレクションによって削除されるまでの一定期間(デフォルトでは約30日〜90日間)ローカルに保持されます。そのため、履歴から完全に消えたように見えるコミットであっても、この reflog からアクセスし復元することができます。
2. 誤って削除した「ローカルブランチ」を復元する
まだリモートにプッシュしていない開発途中のブランチを誤って git branch -D で削除してしまった場合の救出手順です。
ステップ1: reflogログを表示する
以下のコマンドを実行し、HEADの動きを表示します。
git reflog
以下のような出力結果が表示されます。
7c2a1b3 HEAD@{0}: checkout: moving from feature-auth to main
8f9e0d1 HEAD@{1}: commit: feat: implement login API validation
5a4c3d2 HEAD@{2}: commit: feat: design login interface layout
...
ステップ2: 削除したブランチの最後のコミットハッシュを見つける
ログを上から順に読み、削除したブランチ feature-auth にいた時の最後のコミット(この例では 8f9e0d1:feat: implement login API validation)を探し出します。
ステップ3: コミットハッシュからブランチを再作成する
見つかったコミットハッシュ(8f9e0d1)をもとに、新しくブランチを作成して復元します。
git branch feature-auth 8f9e0d1
これで、削除される直前と全く同じ状態の feature-auth ブランチが復活します。
3. git reset --hard で消したコミットを復元する
作業コピーの変更を強制リセットし、過去のコミットを上書きしてしまった場合も reflog が役に立ちます。
ステップ1: リセット直前のHEADの位置を確認する
git reflog を実行します。
3b2a1c9 HEAD@{0}: reset: moving to HEAD~1
9e8d7c6 HEAD@{1}: commit: feat: complex payment integration
上記のログから、HEAD@{1}(ハッシュ 9e8d7c6)の段階では、消去してしまった feat: complex payment integration のコミットが存在していたことが分かります。
ステップ2: リセット前の状態にHEADを戻す
一番安全な方法は、復元したい状態(9e8d7c6)のコミットから新しいレスキュー用ブランチを生やすことです。
git checkout -b rescue-branch 9e8d7c6
これで、失われたコミットが含まれる状態の作業ブランチが立ち上がります。内容に問題がなければ、現在の開発ブランチにこのブランチをマージするか、そのまま開発を継続します。
まとめ
git reflog は、ローカルPC上にのみ存在する最強のバックアップ手段です。
- ローカルで操作したあらゆるHEADの足跡は
git reflogに残る - コミットハッシュさえ分かれば、ブランチの復元(
git branch <名> <ハッシュ>)やチェックアウトが可能 - ガベージコレクションによって消去される前に、早急に対処を行うこと
「壊してしまった」と思っても慌てず、まずは git reflog を実行する習慣を身につけておきましょう。
