Git reflogとは?操作履歴の確認と復元方法を初心者向けに解説

Git reflogの基本的な使い方と実践的な活用方法を初心者向けに解説します。誤ってコミットを削除したり、resetで履歴を消してしまった場合でも、reflogを使えば復元できます。

git reflogとは?

git reflog(リフログ)は、Gitで行った操作の履歴を記録・表示するコマンドです。通常のgit logがコミット履歴を表示するのに対し、reflogはHEAD(現在の作業位置)がどのように移動したかを記録しています。

reflogは「reference log」の略で、ブランチやHEADの参照がどのように変化したかを追跡します。これにより、以下のような状況で威力を発揮します:

  • git reset --hardで誤ってコミットを消してしまった
  • ブランチを削除してしまった
  • リベース(rebase)で履歴がおかしくなった
  • どの操作をしたか思い出せない

git reflogの基本的な使い方

操作履歴を確認する

最も基本的な使い方は、引数なしで実行することです:

git reflog

実行すると、以下のような出力が表示されます:

a1b2c3d HEAD@{0}: commit: 新機能を追加
e4f5g6h HEAD@{1}: checkout: moving from main to feature
i7j8k9l HEAD@{2}: commit: バグを修正
m0n1o2p HEAD@{3}: reset: moving to HEAD~1

各行は以下の情報を含んでいます:

  • コミットハッシュ(a1b2c3d): その時点でのHEADが指していたコミット
  • 参照名(HEAD@{0}): 操作の順番(0が最新)
  • 操作の種類(commit, checkout, reset など): 何をしたか
  • 詳細説明: 操作の詳細

特定のブランチのreflogを確認する

特定のブランチの履歴だけを見たい場合は、ブランチ名を指定します:

git reflog show main

日時情報付きで表示する

いつ操作したかを確認したい場合は、--dateオプションを使います:

git reflog --date=iso

出力例:

a1b2c3d HEAD@{2026-01-05 10:30:00 +0900}: commit: 新機能を追加

reflogを使ったコミットの復元

reflogの最も重要な活用場面は、誤って削除したコミットの復元です。

reset --hardで消したコミットを復元する

以下のような状況を想定してみましょう:

# 誤って直前のコミットを取り消してしまった
git reset --hard HEAD~1

このとき、コミットの内容は消えたように見えますが、reflogには記録が残っています。

復元手順:

  1. reflogで消えたコミットのハッシュを確認
git reflog

出力例:

a1b2c3d HEAD@{0}: reset: moving to HEAD~1
x9y8z7w HEAD@{1}: commit: 重要な変更を追加  ← これが消えたコミット
  1. 見つかったハッシュを使って復元
# 方法1: そのコミットに戻る
git reset --hard x9y8z7w

# 方法2: HEAD@{n}の形式でも指定可能
git reset --hard HEAD@{1}

これで、誤って削除したコミットが復元されます。

削除したブランチを復元する

ブランチを誤って削除した場合も、reflogを使えば復元できます。

# 誤ってブランチを削除
git branch -D feature-branch

復元手順:

  1. reflogで削除前のコミットを探す
git reflog
  1. 見つかったハッシュを使ってブランチを再作成
git branch feature-branch x9y8z7w

reflogの実践的な活用シーン

シーン1: リベースの失敗を取り消す

リベース中に問題が発生し、元の状態に戻したい場合:

# リベース前の状態を確認
git reflog

# 出力例
a1b2c3d HEAD@{0}: rebase (finish): returning to refs/heads/feature
b2c3d4e HEAD@{1}: rebase (pick): コミットメッセージ
c3d4e5f HEAD@{2}: rebase (start): checkout main
d4e5f6g HEAD@{3}: commit: リベース前の状態  ← ここに戻りたい

# リベース前の状態に戻す
git reset --hard HEAD@{3}

シーン2: 作業内容を見失った場合

「さっきまで何をしていたっけ?」という場合に、操作履歴を確認できます:

git reflog --date=relative

出力例:

a1b2c3d HEAD@{5 minutes ago}: commit: 新機能を追加
e4f5g6h HEAD@{10 minutes ago}: checkout: moving from main to feature
i7j8k9l HEAD@{1 hour ago}: commit: バグを修正

シーン3: 特定時点の状態を確認する

過去の特定時点でのコードを確認したい場合:

# 2日前の状態を確認
git show HEAD@{2.days.ago}

# 特定のコミット内容を一時的に確認
git checkout HEAD@{5}

# 確認後、元のブランチに戻る
git checkout -

reflogの注意点

保存期間に制限がある

reflogのエントリは永久に保存されるわけではありません。デフォルトでは以下の期間で自動削除されます:

  • 到達可能なエントリ: 90日間
  • 到達不可能なエントリ: 30日間

保存期間は設定で変更できます:

# 保存期間を180日に変更
git config gc.reflogExpire "180 days"

ローカルリポジトリのみに存在する

reflogはローカルリポジトリにのみ存在します。リモートリポジトリには同期されないため、別のマシンでcloneした場合は、そのマシンでの操作履歴のみが記録されます。

git gcで古いエントリが削除される

git gc(ガベージコレクション)を実行すると、期限切れのreflogエントリが削除されます。緊急で復元が必要な場合は、git gcの実行を避けましょう。

git reflogとgit logの違い

項目git refloggit log
表示内容HEADの移動履歴コミット履歴
削除されたコミット表示される表示されない
リモートとの同期同期されない同期される
主な用途操作の復元履歴の確認

まとめ

git reflogは、Gitの「セーフティネット」として非常に重要なコマンドです。

覚えておきたいポイント:

  • git reflogでHEADの移動履歴を確認できる
  • git reset --hardで消したコミットも復元可能
  • 削除したブランチも復元できる
  • reflogはローカルにのみ存在し、保存期間に制限がある

「やってしまった!」と思ったときは、まずgit reflogを確認しましょう。多くの場合、そこから復元の糸口が見つかります。

日頃からreflogの使い方を覚えておくと、いざというときに慌てずに対処できます。ぜひ実際に試してみてください。

編集部

編集部