git reflogとは
git reflog
はGitの「操作履歴」や「HEAD(現在のブランチの位置)の動き」を記録するコマンドです。通常の git log
では「コミット履歴」のみが表示されますが、git reflog
では「コミット以外の操作」も確認できるため、誤った操作の復元などに役立ちます。
具体的には、以下のものが履歴として残ります。
- 新しいコミットの作成:コミット、マージ、プル、リバートなど
- ブランチの切り替え:チェックアウト操作
- 履歴の変更:リセット、リベースなど
たとえば、間違ってコミットを削除したり、意図しないブランチに移動してしまった場合、git reflog
を使って過去の操作を確認することで元の状態に戻す手がかりを得ることができます。
あわせて読みたい
『GitのHEAD』については下記の記事で詳しく説明しています。興味のある方は下記のリンクからぜひチェックをしてみてください。 続きを見るGitのHEADとは?HEAD~と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 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}
これで変更内容は残したまま、誤って修正したコミットを元に戻すことができます。