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には記録が残っています。
復元手順:
- reflogで消えたコミットのハッシュを確認
git reflog
出力例:
a1b2c3d HEAD@{0}: reset: moving to HEAD~1
x9y8z7w HEAD@{1}: commit: 重要な変更を追加 ← これが消えたコミット
- 見つかったハッシュを使って復元
# 方法1: そのコミットに戻る
git reset --hard x9y8z7w
# 方法2: HEAD@{n}の形式でも指定可能
git reset --hard HEAD@{1}
これで、誤って削除したコミットが復元されます。
削除したブランチを復元する
ブランチを誤って削除した場合も、reflogを使えば復元できます。
# 誤ってブランチを削除
git branch -D feature-branch
復元手順:
- reflogで削除前のコミットを探す
git reflog
- 見つかったハッシュを使ってブランチを再作成
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 reflog | git log |
|---|---|---|
| 表示内容 | HEADの移動履歴 | コミット履歴 |
| 削除されたコミット | 表示される | 表示されない |
| リモートとの同期 | 同期されない | 同期される |
| 主な用途 | 操作の復元 | 履歴の確認 |
まとめ
git reflogは、Gitの「セーフティネット」として非常に重要なコマンドです。
覚えておきたいポイント:
git reflogでHEADの移動履歴を確認できるgit reset --hardで消したコミットも復元可能- 削除したブランチも復元できる
- reflogはローカルにのみ存在し、保存期間に制限がある
「やってしまった!」と思ったときは、まずgit reflogを確認しましょう。多くの場合、そこから復元の糸口が見つかります。
日頃からreflogの使い方を覚えておくと、いざというときに慌てずに対処できます。ぜひ実際に試してみてください。
編集部