Git School · FluxGit

削除したGitブランチを復旧する

FluxGit ·

各ブロックは別のケースであり、一括実行するスクリプトではありません。自分のリポジトリに合うケースを選び、ブランチ名、パス、VERIFIED_COMMITを置き換えてください。中止コマンドは対応する進行中の操作だけに使い、両方の選択肢を実行しないでください。

要点

ブランチ削除で消えるのは参照であり、コミットまで直ちに消えるとは限りません。残っている先端コミットを探して新しいブランチ名を付けます。

例と前提条件

正しいコミットとそのオブジェクトが必要です。削除時のメッセージにSHAが表示される場合は保存し、操作前に確認します。

変更前に状態を確認する

HEADのreflogと候補の履歴を読みます。ブランチのreflogは削除されますが、HEADの記録に関連する移動が残る場合があります。

git reflog --date=iso
git show VERIFIED_COMMIT
git log -5 --oneline VERIFIED_COMMIT

参照または別のチェックアウトを保つ

git branch rescue/deleted-branch VERIFIED_COMMITで、切り替えずにコミットへ名前を付けます。作業ディレクトリを上書きする必要はありません。

git branch rescue/deleted-branch VERIFIED_COMMIT

最初の手順

git showとgit logで、候補の先端と履歴が目的どおりか確認します。その後、元の名前が未使用なら再作成します。

別の結果を意図して選ぶ

リモートブランチがあった場合も、fetchとローカル再作成の前に参照が今も存在するか確認します。過去のpushは保持を保証しません。

制限と例外

新しいcloneに自分のローカルreflogはありません。reflogの期限とオブジェクト削除は別の設定なので、復旧中は強制的な整理を避けます。

git ls-remote --heads origin my-branch

競合と後片付け

参照がなければgit fsck --full --no-reflogs --unreachableで残ったコミットを探せます。どのブランチかは自動判別されないため、候補を確認します。

git fsck --full --no-reflogs --unreachable

結果を確認する

再作成したブランチの履歴と状態を確認します。コミット復旧では、一度もコミットしなかったファイル編集は戻りません。

git log -5 --oneline rescue/deleted-branch
git status --short

よくある質問

失われた名前はバックアップではありません。オブジェクトがなければ、別のコピー、共同作業者、実際に存在するリモート参照を探します。

FluxGitで操作を確認する

FluxGitはアプリ内のブランチ削除を保護できます。有効なRef journalはインストール済みhookの実行時に参照変更を記録します。hookを迂回した操作や別のGit実装は対象外です。

Git公式ドキュメント

Git School · 1:51

reflogで削除したGitブランチを復元する

最近削除したローカルブランチの残っているコミットを見つけ、新しいブランチを作って復元します。テスト用リポジトリでreflogとFluxGitのSafety Timelineを紹介し、インストール済みのRef journalフックがGitコマンドラインによる参照変更を記録できる条件を説明します。

reflogで削除したGitブランチを復元する
ナレーションは英語です。YouTubeでは11言語の手動字幕を利用できます。この文字起こしは日本語です。

YouTubeで見る — 新しいタブが開きます

テスト用リポジトリで収録。音声は英語、字幕は日本語です。復元には残っているコミットオブジェクトと利用できるreflogまたはジャーナルの記録が必要です。Ref journalは未コミットのファイルをバックアップしません。

ナレーションの文字起こしを読む
  1. 00:03 作業のあるブランチを削除してしまいました。git branch -Dで、どこにもマージしていない2つのコミットがあるブランチです。取り戻す方法を見ていきましょう。
  2. 00:13 FluxGitでは、ブランチが一覧から消えています。
  3. 00:17 作業が失われていない理由です。ブランチはラベルです。git branch -Dはラベルを削除しますが、2つのコミットはリポジトリに残り、どのブランチも指していない状態になります。reflogはまだ覚えています。最後のコミットにブランチを作れば、両方を取り戻せます。
  4. 00:36 Safety Timelineを開きます。reflogを分かりやすい文で表示します。
  5. 00:44 Find a lost commitで、メッセージの一部を入力します。削除したブランチの最後のコミットが1件見つかります。
  6. 00:52 Create branch here。復元用のブランチがそのコミットを指し、ほかは何も動きません。
  7. 00:58 2つのコミットがグラフに戻りました。
  8. 01:02 このリポジトリのRef journalを有効にします。
  9. 01:06 インストール済みのGitフックが実行されると、FluxGitはGitコマンドラインで行われたブランチ削除を記録できます。ターミナルやエージェントのコマンドも含まれます。
  10. 01:15 フックの回避や他のGit実装は対象外です。
  11. 01:19 記録するのは参照であり、未コミットのファイルではありません。
  12. 01:23 復元にはコミットオブジェクトが残っている必要があります。
  13. 01:28 ターミナルでは、git reflogでコミットを見つけ、git branchに元の名前とそのコミットを指定します。
  14. 01:36 まとめです。削除されたブランチは失われたラベルであり、reflogでコミットをまだ見つけられます。次のレッスンは、AIエージェントがコードを削除した場合です。

関連する手順

FluxGitをダウンロード