やりたかったこと

git reset --hard でコミットを消してしまい、元に戻せないかと焦った。 git reflogを使えば、削除したと思ったコミットも復元できることがわかった。

reflogとは

git reflogはHEADの移動履歴を記録しているコマンド。 通常のgit logには表示されない「消えたコミット」も確認できる。

git reflog

出力例:

a1b2c3d HEAD@{0}: reset: moving to HEAD~2
e4f5g6h HEAD@{1}: commit: フォームのバリデーション追加
i7j8k9l HEAD@{2}: commit: ログイン機能を実装

コミットを復元する手順

手順1:reflogで対象のコミットを探す

git reflog

復元したいコミットのハッシュ(例:e4f5g6h)をメモする。

手順2:cherry-pickで取り込む

そのコミットだけ復元したい場合:

git cherry-pick e4f5g6h

手順3:resetでその時点まで戻す

その時点以降のコミットをまとめて戻したい場合:

git reset --hard e4f5g6h

stashで消えたと思った変更を復元する

stashした変更がわからなくなった場合も、reflogで確認できる。

git reflog show stash

または、dangling commitを全部探したい時:

git fsck --lost-found

ハマったポイント

  • reflogの履歴はデフォルトで90日間保持される(それ以降は参照不可)
  • reflogはローカルにしかない。新しいクローン環境には引き継がれない
  • リモートにpush済みのコミットを取り消した場合は別途git push --forceが必要になる
  • --orphanブランチでの作業はreflogに残らないことがある

関連記事

おすすめのVPS/ドメイン/スクール