git reflogとは?「使い方」などをわかりやすく解説!

git reflogとは

git reflogGitの「操作履歴」や「HEAD(現在のブランチの位置)の動き」を記録するコマンドです。通常の git log では「コミット履歴」のみが表示されますが、git reflogでは「コミット以外の操作」も確認できるため、誤った操作の復元などに役立ちます。

具体的には、以下のものが履歴として残ります。

  • 新しいコミットの作成:コミット、マージ、プル、リバートなど
  • ブランチの切り替え:チェックアウト操作
  • 履歴の変更:リセット、リベースなど

たとえば、間違ってコミットを削除したり、意図しないブランチに移動してしまった場合、git reflogを使って過去の操作を確認することで元の状態に戻す手がかりを得ることができます。

あわせて読みたい

GitのHEAD』については下記の記事で詳しく説明しています。興味のある方は下記のリンクからぜひチェックをしてみてください。

git reflogの使い方

まず、git reflogコマンドを実行してみましょう。以下のコマンドを実行すると、Gitの操作履歴が表示されます。

git reflog

例えば、次の操作を行っていたとします。

  • new-featureブランチにチェックアウト
  • new-featureブランチでsampleA.txtを作成してコミット(コミットメッセージはCommit A)
  • new-featureブランチでsampleB.txtを作成してコミット(コミットメッセージはCommit B)

上記の操作を行った後、git reflog を実行すると、以下のような操作履歴が表示されます。上に表示されているものほど新しい履歴です。

$ git reflog
55862df (HEAD -> new-feature) HEAD@{0}: commit: Commit B
7ba1891 HEAD@{1}: commit: Commit A
b087121 (main) HEAD@{2}: checkout: moving from main to new-feature

上記の実行結果は以下の情報で構成されています。

  • コミットID
  • HEADの位置(操作の時点で自分がいたブランチ)
    • HEAD@{2} の時点では main ブランチにいて、HEAD@{0} の時点では new-feature にいることが分かります。
  • Git操作の履歴番号
    • HEAD@{n}という形式でGit操作の履歴番号が表示されます。
  • 操作の詳細
    • コミットメッセージや操作の内容が表示されます。

git reflogで誤った操作を復元する

git reflogは主に誤った操作を復元する際に使用します。復元する手順を以下に示します。

  • git reflogでGitの操作履歴を確認する
  • 戻りたい地点の履歴番号を指定してリセットする

では実際にgit reflogを用いて誤った操作を復元してみましょう。

間違えてgit reset --hardで必要な変更も消した場合の復元方法

例えば、new-featureブランチで間違えてgit reset --hard HEAD~を実行し、最新のコミットを削除してしまったとします。

# 誤ってリセットを実行
git reset --hard HEAD~

上記のコマンドを実行した結果、Commit Bのコミットが削除されてしまいました。この削除したコミットを元に戻します。

まずは、git reflogでGitの操作履歴を確認します。

$ git reflog
7ba1891 (HEAD -> new-feature) HEAD@{0}: reset: moving to HEAD~
55862df HEAD@{1}: commit: Commit B
7ba1891 (HEAD -> new-feature) HEAD@{2}: commit: Commit A
b087121 (main) HEAD@{3}: checkout: moving from main to new-feature

このgit reflogを見ると、HEAD@{0}という作業番号で誤ったgit reset --hard HEAD~を行っていることがわかります。

次に、戻りたい地点の履歴番号を指定してリセットします。

HEAD@{1} が削除してしまったコミットCommit Bに該当するので、次のコマンドで復元します。

git reset --hard HEAD@{1}

これで、削除されたCommit Bのコミットと変更内容が復活します。

あわせて読みたい

git resetコマンド』については下記の記事で詳しく説明しています。興味のある方は下記のリンクからぜひチェックをしてみてください。

間違えてgit commit --amendでコミットに不要な変更を混ぜた場合の復元方法

例えば、new-featureブランチで新たにsampleC.txtというファイルを作成し、誤って--amendでコミットを修正してしまったとします。

# 新しいファイルの作成と誤ったコミット修正
echo "hogehoge" > sampleC.txt
git add .
git commit --amend -m "Commit C"

上記のコマンドを実行した結果、前回の「Second Commit」コミットで行った変更を「Third Commit」コミットに混ぜてしまいました。これをgit reflogで元に戻してみます。

まずは、git reflogでGitの操作履歴を確認します。

$ git reflog
991fea2 (HEAD -> new-feature) HEAD@{0}: commit (amend): Commit C
55862df HEAD@{1}: commit: Commit B
7ba1891 HEAD@{2}: commit: Commit A
b087121 (main) HEAD@{3}: checkout: moving from main to new-feature

このgit reflogを見ると、HEAD@{0}という作業番号で誤ったgit commit --amendを行っていることがわかります。

次に、戻りたい地点の履歴番号を指定してリセットします。

git commit --amendを行った前の操作(HEAD@{1})の状態に戻りたいので、以下のコマンドを実行します(変更内容を残すため--softオプションを用いています)。

git reset --soft HEAD@{1}

これで変更内容は残したまま、誤って修正したコミットを元に戻すことができます。