reflogでgit reset --hardから復旧する
各ブロックは別のケースであり、一括実行するスクリプトではありません。自分のリポジトリに合うケースを選び、ブランチ名、パス、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 reset --hard を取り消す:消えたコミットを復旧
git reset --hard の後、コミットのオブジェクトが保持されている間は、ローカルの reflog を使ってコミット済みの変更を復旧できます。reflog の期限切れやオブジェクトの削除後は、復旧できるとは限りません。
テスト用リポジトリで収録しています。
ナレーションの文字起こしを読む
- git reset --hard を実行したら、最後のコミットが消えてしまいました。誰でも一度は経験することです。復旧方法と、その仕組みを紹介します。
- まず、作業をコミットします。支払い処理の呼び出しを二度再試行する変更です。
- 次に、ターミナルで git reset --hard HEAD~1 を実行します。
- FluxGit はすぐに検知します。ブランチが一つ前に戻り、そのコミットはブランチ上から外れました。
- それでも失われていない理由はこうです。ブランチはコミットを指すラベルにすぎません。reset はラベルを前の位置に戻しますが、コミットはリポジトリに残り、Git の日記である reflog にも記録されています。そのコミットにブランチを作れば、取り戻せます。
- FluxGit の Recover lost work は、わかりやすく説明して、必要な場所へ案内します。
- Safety Timeline は reset を一文で表示します。reset の直前の時点から、ブランチを作成します。
- コミットが、専用のブランチ上に戻りました。
- コミットしていない作業は reflog には記録されません。復元ポイントが有効で、ローカルの変更が検出された場合、FluxGit は hard reset の前に安全用の stash を保存できます。この例の通常の Git を使ったターミナルでの reset は、その保護を経由しません。
- ターミナルでも同じです。git reflog で reset の直前の行を見つけ、そのコミットにブランチを作成します。
- まとめです。reset はラベルを移動します。reflog は元の位置を覚えています。コミットを残すには、ブランチを作成します。次のレッスンは、削除したブランチの復旧です。