削除したGitブランチを復旧する
各ブロックは別のケースであり、一括実行するスクリプトではありません。自分のリポジトリに合うケースを選び、ブランチ名、パス、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公式ドキュメント
reflogで削除したGitブランチを復元する
最近削除したローカルブランチの残っているコミットを見つけ、新しいブランチを作って復元します。テスト用リポジトリでreflogとFluxGitのSafety Timelineを紹介し、インストール済みのRef journalフックがGitコマンドラインによる参照変更を記録できる条件を説明します。
テスト用リポジトリで収録。音声は英語、字幕は日本語です。復元には残っているコミットオブジェクトと利用できるreflogまたはジャーナルの記録が必要です。Ref journalは未コミットのファイルをバックアップしません。
ナレーションの文字起こしを読む
- 作業のあるブランチを削除してしまいました。git branch -Dで、どこにもマージしていない2つのコミットがあるブランチです。取り戻す方法を見ていきましょう。
- FluxGitでは、ブランチが一覧から消えています。
- 作業が失われていない理由です。ブランチはラベルです。git branch -Dはラベルを削除しますが、2つのコミットはリポジトリに残り、どのブランチも指していない状態になります。reflogはまだ覚えています。最後のコミットにブランチを作れば、両方を取り戻せます。
- Safety Timelineを開きます。reflogを分かりやすい文で表示します。
- Find a lost commitで、メッセージの一部を入力します。削除したブランチの最後のコミットが1件見つかります。
- Create branch here。復元用のブランチがそのコミットを指し、ほかは何も動きません。
- 2つのコミットがグラフに戻りました。
- このリポジトリのRef journalを有効にします。
- インストール済みのGitフックが実行されると、FluxGitはGitコマンドラインで行われたブランチ削除を記録できます。ターミナルやエージェントのコマンドも含まれます。
- フックの回避や他のGit実装は対象外です。
- 記録するのは参照であり、未コミットのファイルではありません。
- 復元にはコミットオブジェクトが残っている必要があります。
- ターミナルでは、git reflogでコミットを見つけ、git branchに元の名前とそのコミットを指定します。
- まとめです。削除されたブランチは失われたラベルであり、reflogでコミットをまだ見つけられます。次のレッスンは、AIエージェントがコードを削除した場合です。