削除した Git ブランチを reflog で見つけて復元する過程を示す代表画像

目標

別のブランチに削除した特定のコミット時点を復元します。

状況

ブランチを削除した後、そのブランチで作業していたコミットにブランチを再び復元する必要がある場合があります。


1. reflog で復元ポイント(コミットハッシュ)を見つける

reflog はブランチを削除してもローカルで HEAD が移動した記録を残しているため、復元するコミットハッシュを見つけるのに役立ちます。

1git reflog

復元対象の選択

reflog の出力から復元したい時点のコミットハッシュを確認します。

git reflog の出力から復元する時点のコミットハッシュを見つける画面


2. コミットハッシュでブランチを作り直す

見つけたコミットハッシュを基準に新しいブランチを作成し、すぐにチェックアウトします。

1# git checkout -b <復元する新しいブランチ名> <削除したコミットハッシュ>
2git checkout -b repair-1234 f730c6ea10

3. 復元の確認

ブランチが正常に作成され、該当コミットに移動したかを確認します。

新しいブランチが作成され、該当コミットに移動したことを確認する画面


reflog に記録がない場合

reflog はこのコンピューター上で HEAD が動いた記録です。そのため、以下の場合には役立ちません。

  • このコンピューターで該当ブランチを一度もチェックアウトしたことがない場合
  • リポジトリを新しくクローンした場合
  • reflog の項目がすでに期限切れになっている場合

reflog の保存期間

reflog は無期限には残りません。git gc が動作する際、以下の設定に従って整理されます。

1# 到達可能なコミットの reflog 保存期間(デフォルト90日)
2git config --get gc.reflogExpire
3
4# 到達不可能なコミットの reflog 保存期間(デフォルト30日)
5git config --get gc.reflogExpireUnreachable

削除したブランチのコミットは通常到達不可能な状態になるため、デフォルト値である30日が実質的な復元の限界です。

dangling コミットを直接探す

reflog に表示されない場合は、オブジェクトストアを直接確認します。

1git fsck --lost-found
2
3# Result
4# dangling commit f730c6ea10ffc0d1f2f8b0e9a1c3d5b7e9f10234
5# dangling blob 8a9f2c1b...

見つけたコミットの内容を確認した後、ブランチとして蘇らせます。

1# コミット内容の確認
2git show f730c6ea10
3
4# ブランチ作成(チェックアウトなし)
5git branch repair-1234 f730c6ea10

注意) git gc --prune が該当オブジェクトまで整理した後であれば、ローカルでは復元できません。

リモートにあったブランチを削除した場合

リモートブランチを削除し、ローカルにも記録がない場合、ローカルの reflog では見つけることができません。この場合は、他のチームメンバーのローカルリポジトリに該当コミットが残っているか確認するほうが早いです。

復元したブランチを再びリモートにアップロードする際は、以下のように実行します。

1git push -u origin repair-1234

まとめ

  • 削除直後であれば git reflog で十分です。
  • 時間が経って reflog から消えた場合は、git fsck --lost-found で dangling コミットを探します。
  • ただし gc がオブジェクトまで整理してしまった場合、ローカルでの復元は不可能なので、重要な作業ブランチは削除する前にタグを付けておくほうが安全です。
1# 削除前に安全装置を残しておく方法
2git tag backup/feature-1234 feature-1234