git reflog
HEAD やブランチが指してきた履歴を記録した参照ログを表示します。誤って削除したコミットやブランチを復元する際の命綱になります。
構文
git reflog [subcommand] [options] git reflog は、HEAD やブランチがこれまで指してきたコミットの移動履歴(参照ログ)を表示するコマンドです。git log がコミットの祖先関係を表示するのに対し、reflog は「自分のローカル環境で HEAD がどう動いたか」という操作履歴を記録します。
🛟
git reflogは命綱です
git reset --hardでコミットを消してしまった、ブランチを間違って削除した——そんな「もう戻れない」と思った状況でも、reflog にはほとんどの場合まだ痕跡が残っています。パニックになる前に、まずgit reflogを確認してください。
基本的な使い方
git reflog
e4f5g6h HEAD@{0}: commit: ログイン機能を追加
a1b2c3d HEAD@{1}: checkout: moving from feature/login to main
f9e8d7c HEAD@{2}: reset: moving to HEAD~1
1234abc HEAD@{3}: commit: README を更新
HEAD@{0} が最新の操作、番号が大きくなるほど過去の操作を表します。commit checkout reset rebase merge など、HEAD を動かすほぼすべての操作が記録されます。
reflog は git log と何が違うか
git log | git reflog | |
|---|---|---|
| 表示対象 | コミットの祖先関係(ブランチ図) | ローカルでの HEAD の移動履歴 |
| 削除されたコミットの表示 | されない | される(期限切れになるまで) |
| リモートとの共有 | される | されない(ローカル専用、.git/logs/ に保存) |
reset --hard でコミットがブランチから見えなくなっても、実体はしばらく .git 内に残っています。reflog はその「見えなくなったコミット」への入り口になります。
復元の基本手順
# 1. reflog で戻りたい地点を探す
git reflog
# 2. 該当のコミットハッシュ(またはHEAD@{n})を確認してチェックアウト
git checkout f9e8d7c
# 3. 内容を確認できたら、ブランチとして残す
git switch -c recovered-branch
もしくは、現在のブランチをその時点に戻したい場合:
# 現在のブランチのポインタを reflog 上の地点に戻す
git reset --hard HEAD@{2}
よくある使いどころ:誤って reset —hard したコミットを戻す
# 誤って直前のコミットを消してしまった
git reset --hard HEAD~1
# reflog で消える前の HEAD を確認
git reflog
# e4f5g6h HEAD@{1}: commit: 消してしまったコミット
# f9e8d7c HEAD@{0}: reset: moving to HEAD~1 ← 直前の reset 操作
# 消える前の状態に戻す
git reset --hard e4f5g6h
よくある使いどころ:削除したブランチを復元する
# ブランチを誤って削除してしまった
git branch -D feature/important
# reflog からそのブランチの最終コミットを探す
git reflog
# a1b2c3d HEAD@{3}: checkout: moving from feature/important to main
# 見つけたコミットからブランチを再作成
git checkout -b feature/important a1b2c3d
ヒント
- reflog のエントリはデフォルトで90日(到達不能なコミットは30日)ほどで期限切れになり、
git gcによって削除されます。長期間の保険にはなりません。 - 迷ったコミットが本当に必要な内容か不安なときは、
git show <hash>で中身を確認してからチェックアウトすると安全です。 git reflog --allを使うと、すべてのブランチ・タグの参照ログをまとめて確認できます。