やりたかったこと
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に残らないことがある
関連記事
- Gitで間違えてcommitした時の取り消し方
- git cherry-pickで特定のコミットだけ別ブランチに適用する
- git stashで作業を一時退避する方法
- git logでコミット履歴を確認する方法
- git rebaseの基本的な使い方