🐧 Linux 総合学習プラットフォーム
中級 ・ Git / 復旧 / reflog

消したコミット・ブランチの救出

reset --hardで消したはずのコミットが実は必要だった、あるいはマージ済みと勘違いしてブランチを削除してしまった。履歴から救出したい。

手順

git reflogHEADの移動履歴を新しい順に一覧する。reset・checkout・commitの足跡が全部残っており、消えたコミットのハッシュがここで見つかることが多い。
git log --oneline -5 HEAD@{2}怪しい時点(例: 2回前のHEAD位置)の履歴を中身で確認する。ハッシュだけで判断せず、コミットメッセージで「これだ」と裏を取る。
git branch rescue/lost-work abc1234見つけたコミットに救出用ブランチを付けて命綱を確保する。ブランチが付けばもうGCに回収されない。
git fsck --lost-foundreflogにも出てこない場合の最終手段。どこからも参照されていないコミット(dangling commit)を洗い出せる。
git show 【danglingのハッシュ】候補のコミットの中身を1件ずつ確認する。日時と差分を見れば探している作業かどうか判別できる。
git cherry-pick abc1234救出したコミットを現在のブランチに取り込む。ブランチ丸ごと戻したいなら手順3のブランチにcheckoutすればよい。
注意reflogはローカル専用で、既定では期限切れエントリがやがて掃除される。「消した」と気づいたら、その場でgit gcなどの掃除系コマンドを実行せず、まず救出ブランチを付けること。

▶ 学習アプリで実務レシピを使う