Git reflog完全ガイド|消えたコミットを復元!reset・rebaseの巻き戻し手順を徹底解説
Gitを使っていると、一度は経験するのが「やってはいけない操作」です。
誤って git reset --hard を実行してしまったり、rebaseで履歴を壊してしまったり、削除したブランチに重要なコミットが含まれていたり…。
そんな絶望的な状況を救ってくれるのが git reflog です。
私自身、旅行しながらノートPCで開発している最中に、深夜のホテルで誤ってコミット履歴を消してしまったことがあります。「終わった…」と思った瞬間に助けてくれたのがreflogでした。
この記事では、Git reflogの基本から実践的な復旧方法まで、初心者にも分かりやすく解説します。
Git reflogとは?
Git reflogとは、ローカルリポジトリ内で行われた参照の変更履歴を記録する仕組みです。
通常のGitログでは確認できない操作履歴も記録されるため、誤操作からの復元に非常に役立ちます。
Git reflogでできること
- 消えたコミットの復元
- reset前の状態へ戻す
- rebase失敗時の復旧
- 削除したブランチ内のコミットを探す
- 過去のHEAD位置を確認する
Gitの「最後の砦」と呼ばれることもあるほど強力な機能です。
Git reflogの基本
reflogはHEADやブランチ参照の移動履歴をすべて記録しています。
以下のような操作が記録対象になります。
- コミット
- チェックアウト
- ブランチ切り替え
- リベース
- マージ
- リセット
- リバート
reflogを確認する
git reflog
実行すると以下のような履歴が表示されます。
abc1234 HEAD@{0}: commit: Fix login bug
def5678 HEAD@{1}: checkout: moving from main to feature
ghi9012 HEAD@{2}: reset: moving to HEAD1
HEADがどのように移動したかを時系列で確認できます。
履歴数を制限して表示する
git reflog -n 10
直近10件のみ表示できます。
特定の参照を確認する
git reflog show HEAD
HEADの変更履歴だけを確認したい場合に便利です。
Git reflogの影響範囲
reflogを安全に使うためには、どこまで影響するのかを理解することが重要です。
ローカルリポジトリのみ有効
reflogはローカルリポジトリ専用の機能です。
- 他の開発者には共有されない
- GitHubには保存されない
- 自分のPCだけで管理される
そのため、チーム開発中でも安心して利用できます。
リモートリポジトリには影響しない
リモート側の履歴はreflogでは確認できません。
GitHubやGitLab上の操作履歴は、それぞれのログ機能やブランチ履歴を確認しましょう。
HEADの指定方法を理解しよう
reflogを使う際に最も重要なのがHEAD指定です。
直前のコミット
HEAD^
1つ前の操作
HEAD@{1}
3コミット前
HEAD3
範囲指定
HEAD~5..HEAD^
特に HEAD@{n} はreflogで頻繁に使用するため覚えておきましょう。
Git reflogのサブコマンド
変更履歴を表示する
git reflog
特定参照を表示する
git reflog show HEAD
参照可能な履歴を確認する
git reflog list
古い履歴を削除する
git reflog expire --expire=90.days --all
ディスク容量を節約したい場合に利用します。
特定エントリを削除する
git reflog delete HEAD@{2}
誤った履歴を削除できますが、慎重に実行しましょう。
Git reflogの参照渡し
reflogのエントリを利用すると、任意の時点へ簡単に戻れます。
4つ前の操作へ戻る
git reflog
git reset --hard HEAD@{3}
まずreflogで履歴を確認し、戻したい地点を特定します。
その後、resetで対象の状態へ復元します。
時間指定によるGit reflogの活用
reflogは日時を指定して過去へ戻ることも可能です。
昨日の状態へ戻す
git reset --hard HEAD@{yesterday}
日時を指定する
git reset --hard HEAD@{"2024-07-01 10:00:00"}
3時間前へ戻す
git reset --hard "HEAD@{3 hours ago}"
障害発生時刻が分かっている場合に非常に便利です。
時間指定の注意点
- 事前バックアップを取る
- 対象日時を正確に確認する
- 重要イベント前後の履歴を把握する
Git reflogで消えたコミットを復元する方法
開発中に最も助かるのがコミット復元です。
誤ってコミットを削除した場合
例えばリリース前の履歴整理中に、必要なコミットまで消してしまったとします。
手順1:履歴を確認
git reflog
手順2:コミットハッシュを探す
復元したいコミットのハッシュ値を確認します。
手順3:新しいブランチを作成
git checkout -b recovery-branch <コミットハッシュ>
これだけで失われたコミットを再び利用できます。
削除したブランチを復元する方法
厳密にはブランチそのものではなく、ブランチ内に存在していたコミットを利用して復元します。
復元手順
git reflog
削除前のコミットハッシュを確認します。
git checkout -b restored-feature <コミットハッシュ>
これで新しいブランチとして再作成できます。
rebase失敗時の救済方法
Git初心者が最も苦戦しやすいのがrebaseです。
rebaseのメリット
- 履歴を綺麗にできる
- 不要なマージコミットを減らせる
- レビューしやすくなる
しかし操作を間違えると履歴が大きく変わるため注意が必要です。
rebaseを中止する
git rebase --abort
reflogで元に戻す
git reflog
リベース前が1つ前の状態なら以下を実行します。
git reset --hard HEAD@{1}
これでrebase実行前の状態へ戻せます。
reflogの保存期間を変更する
デフォルトではreflogの履歴は約90日で削除されます。
長期間保持したい場合は以下の設定を利用します。
git config --global gc.reflogExpire "180 days"
半年間履歴を保持できるようになります。
Git reflog利用時の注意点
- ローカル限定機能である
- 期限を過ぎると履歴が削除される
- reset --hardは現在の変更を失う
- 重要作業前はバックアップ推奨
- 削除系コマンドは慎重に実行する
まとめ
Git reflogは、Gitを使うすべての開発者が覚えておきたい強力な復旧機能です。
特に以下の場面では大活躍します。
- git resetで履歴を消した
- rebaseに失敗した
- 削除したブランチを復元したい
- 過去の状態に戻したい
- 消えたコミットを探したい
普段は意識することの少ないコマンドですが、いざという時に知っているかどうかで作業時間が大きく変わります。
まずは検証用リポジトリで実際に git reflog を試しながら、HEADの動きを確認してみてください。きっとGitへの理解が一段深まるはずです。







0 件のコメント:
コメントを投稿