git reflogとDetached HEAD状態からの消失コミット救出手順

Git DevOps CLI Workflow
結論

git reflog でハッシュを探し、git branch rescue <hash> で復元します。

# Git SCM公式仕様:git reflog を用いた消失コミットの救出フロー
# 1. HEAD の全移動履歴を表示
git reflog

# 出力例:
# e4f5a6b HEAD@{0}: checkout: moving from e4f5a6b... to main
# a1b2c3d HEAD@{1}: commit: [Detached HEADでの未保存コミット] <- 救出対象!
# 9c8b7a6 HEAD@{2}: checkout: moving from main to 9c8b7a6

# 2. 消失したコミットハッシュから新ブランチを生やして安全救出
git branch rescue-branch a1b2c3d

# 3. 救出ブランチへ切替
git checkout rescue-branch

Git SCM公式仕様:git reflog の追跡メカニズム

Git SCM公式ドキュメント(git-scm.com/docs/git-reflog)の規定通り、Git は HEAD ポインタが移動したあらゆるアクション(commit, checkout, reset, rebase, merge)の履歴をローカル環境(.git/logs/HEAD)に自動記録しています。

ブランチ参照から外れて画面上から消えた「迷子コミット(Orphaned Commit)」も、GC(ガベージコレクション)が走るまでの一定期間(標準 90日間)はディスク上に保持されています。


実際に起こる恐怖の障害:誤った reset --hard と Detached HEAD 放置

障害1: git reset --hard の誤実行による作業消滅

過去のコミットに遡ろうとして誤って git reset --hard HEAD~5 を叩いてしまい、直近で書いた数日分の未プッシュコミットがログ(git log)から一瞬で消え去る事故です。

障害2: Detached HEAD 状態での作業とブランチ切替

git checkout v1.0.0 のようにタグやハッシュに対して直にチェックアウトした Detached HEAD(ブランチ不在) の状態で開発を行い、そのまま git checkout main で別ブランチへ移動すると、Detached HEAD 上で作ったコミットへのポインタが喪失し、作業内容が行方不明になる障害 が発生します。


完全救出の手順

  1. 焦ってコミットや追加変更を行わず、ターミナルで git reflog を実行する
  2. ログ一覧から、消失する直前(HEAD@{1}commit: ... 等)の 7桁のコミットハッシュ値(例: a1b2c3d)を特定する
  3. git branch <救出用ブランチ名> <ハッシュ値> を実行し、消失コミットを指す新しいブランチを作成する
  4. git checkout <救出用ブランチ名> で移動し、コードが完全に元通り復元されたことを確認する