応用

git reflog

HEAD やブランチが指してきた履歴を記録した参照ログを表示します。誤って削除したコミットやブランチを復元する際の命綱になります。

構文 git reflog [subcommand] [options]

オプション

フラグ 説明
--expire=<time> 指定した期間より古いreflogエントリを期限切れとしてマークします(gc の対象になります)。
--all すべての参照(全ブランチ・すべてのHEAD移動)のreflogを表示します。
show reflog の内容を表示します(引数なしの git reflog と同じ)。
delete 指定したreflogエントリを削除します。

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 loggit 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 を使うと、すべてのブランチ・タグの参照ログをまとめて確認できます。