Git School · FluxGit

reflogでgit reset --hardから復旧する

FluxGit ·

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

要点

git reset --hardの後は、reflogで以前のコミットを探し、内容を確認して救出用ブランチを作ります。コミットのオブジェクトが残っていることが条件です。

例と前提条件

この手順はコミット済みの作業を復旧します。作業ディレクトリだけにあった未コミットの編集は、reflogには保存されていません。

変更前に状態を確認する

新たなreset、rebase、ブランチ切り替えを控えます。参照を動かす前にgit reflogを読み、git showで内容を確認してください。

git status --short
git reflog --date=iso
git show VERIFIED_COMMIT

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

VERIFIED_COMMITにrescue/lost-workを作ります。現在のブランチや作業ファイルを変更せず、見つかったコミットに参照を与えられます。

git branch rescue/lost-work VERIFIED_COMMIT
git log -5 --oneline rescue/lost-work

最初の手順

復旧したブランチの履歴とパッチを確認します。別のcheckoutで確認するか、必要な変更を選んで取り込めます。

別の結果を意図して選ぶ

見つかったコミットへの直接のresetは、ブランチ、インデックス、ファイルを再び変更します。まず現在の編集と救出用参照を保存してください。

制限と例外

HEAD@{1}はreflogの位置であり、正しいコミットとは限りません。ORIG_HEADに以前の先端が残る場合もありますが、別の操作で上書きされます。

競合と後片付け

reflogの期限切れとオブジェクトの削除は、それぞれ設定可能な別の仕組みです。古い記録があっても、削除されたオブジェクトは再構築できません。

結果を確認する

救出用ブランチのコミット、ファイル、履歴を確認し、変更を取り込む前に必要なテストを実行します。

git show --stat rescue/lost-work
git status --short

よくある質問

git revertは変更を打ち消す新しいコミットを作り、reset前の位置には戻しません。ステージしただけの内容をgit fsckで見つけられる場合もありますが、名前や構造は保証されません。

FluxGitで操作を確認する

FluxGitのSafety Timelineはreflogの移動と復元ポイントをまとめます。機能が有効でローカル変更を検出した場合、対象のresetでは安全用stashを保存できます。動画の通常の端末resetにはこの保護はありません。

Git公式ドキュメント

Git School · 1:50

git reset --hard を取り消す:消えたコミットを復旧

git reset --hard の後、コミットのオブジェクトが保持されている間は、ローカルの reflog を使ってコミット済みの変更を復旧できます。reflog の期限切れやオブジェクトの削除後は、復旧できるとは限りません。

git reset --hard を取り消す:消えたコミットを復旧
ナレーションは英語です。YouTubeでは11言語の手動字幕を利用できます。この文字起こしは日本語です。

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

テスト用リポジトリで収録しています。

ナレーションの文字起こしを読む
  1. 00:03 git reset --hard を実行したら、最後のコミットが消えてしまいました。誰でも一度は経験することです。復旧方法と、その仕組みを紹介します。
  2. 00:12 まず、作業をコミットします。支払い処理の呼び出しを二度再試行する変更です。
  3. 00:19 次に、ターミナルで git reset --hard HEAD~1 を実行します。
  4. 00:24 FluxGit はすぐに検知します。ブランチが一つ前に戻り、そのコミットはブランチ上から外れました。
  5. 00:31 それでも失われていない理由はこうです。ブランチはコミットを指すラベルにすぎません。reset はラベルを前の位置に戻しますが、コミットはリポジトリに残り、Git の日記である reflog にも記録されています。そのコミットにブランチを作れば、取り戻せます。
  6. 00:47 FluxGit の Recover lost work は、わかりやすく説明して、必要な場所へ案内します。
  7. 00:59 Safety Timeline は reset を一文で表示します。reset の直前の時点から、ブランチを作成します。
  8. 01:06 コミットが、専用のブランチ上に戻りました。
  9. 01:10 コミットしていない作業は reflog には記録されません。復元ポイントが有効で、ローカルの変更が検出された場合、FluxGit は hard reset の前に安全用の stash を保存できます。この例の通常の Git を使ったターミナルでの reset は、その保護を経由しません。
  10. 01:26 ターミナルでも同じです。git reflog で reset の直前の行を見つけ、そのコミットにブランチを作成します。
  11. 01:34 まとめです。reset はラベルを移動します。reflog は元の位置を覚えています。コミットを残すには、ブランチを作成します。次のレッスンは、削除したブランチの復旧です。

関連する手順

FluxGitをダウンロード