Notice [8] Undefined index: 0 in /home/kusanagi/keis/DocumentRoot/wp-content/themes/keis-software/functions.php on line 46

KEIS BLOGは株式会社ケイズ・ソフトウェアが運営しています。

KEIS BLOG

これやったらこういう reflog が出る!実例集


Gitのreflogは、リポジトリ内で行われたすべての操作の履歴を記録する強力なツールです。しかし、具体的にどのような操作がどのようなreflogエントリを生成するのかを理解するのは初心者にとって難しいかもしれません。この記事では、実際に行った操作に対するgit reflogの出力例をいくつか紹介し、その見方と活用方法について詳しく解説します。

目次


シンプルなコミット

まずは、基本的なコミット操作を行った場合のgit reflogの出力を見てみましょう。

git add .
git commit -m "初期コミット"
git reflog

出力例:

abc1234 HEAD@{0}: commit: 初期コミット
def5678 HEAD@{1}: checkout: moving from master to feature

ここでは、最新のコミットがHEAD@{0}として表示されています。このエントリは「初期コミット」を示しています。

コミットの修正(amend)

既存のコミットに変更を加えるために--amendオプションを使用すると、以下のようなreflogが記録されます。

git commit --amend -m "初期コミットを修正"
git reflog

出力例:

def5678 HEAD@{0}: commit (amend): 初期コミットを修正
abc1234 HEAD@{1}: commit: 初期コミット

ここでは、最新のHEAD@{0}が修正されたコミットを示し、HEAD@{1}には修正前のコミットが残っています。

ソフトリセット(git reset –soft)

git reset --softは、指定したコミットにHEADを移動させ、ステージングエリアに変更を残します。

git reset --soft HEAD~1
git reflog

出力例:

ghi9012 HEAD@{0}: reset: moving to HEAD~1
def5678 HEAD@{1}: commit (amend): 初期コミットを修正
abc1234 HEAD@{2}: commit: 初期コミット

HEAD@{0}はリセット操作を示し、HEADが一つ前のコミットに移動したことがわかります。変更はステージングエリアに残っています。

ハードリセット(git reset –hard)

git reset --hardは、指定したコミットにHEADを移動させ、作業ディレクトリとステージングエリアもその状態に戻します。

git reset --hard HEAD~1
git reflog

出力例:

jkl3456 HEAD@{0}: reset: moving to HEAD~1
ghi9012 HEAD@{1}: reset: moving to HEAD~1
def5678 HEAD@{2}: commit (amend): 初期コミットを修正
abc1234 HEAD@{3}: commit: 初期コミット

HEAD@{0}HEAD@{1}は連続してリセット操作を示しています。作業ディレクトリとステージングエリアが完全に指定したコミットに戻っていることが確認できます。

ブランチの切り替え(checkout)

ブランチを切り替える際にもreflogにエントリが記録されます。

git checkout feature
git reflog

出力例:

mno3456 HEAD@{0}: checkout: moving from master to feature
jkl3456 HEAD@{1}: reset: moving to HEAD~1
ghi9012 HEAD@{2}: reset: moving to HEAD~1
def5678 HEAD@{3}: commit (amend): 初期コミットを修正
abc1234 HEAD@{4}: commit: 初期コミット

最新のHEAD@{0}はブランチの切り替えを示しています。

マージコミット

ブランチをマージする際にもreflogにエントリが追加されます。

git checkout master # マージを受け入れる側へ
git merge feature # ここで初めてマージコミットが生まれる

出力例:

pqr6789 HEAD@{0}: merge feature: Merge made by the 'recursive' strategy.
mno3456 HEAD@{1}: checkout: moving from master to feature
jkl3456 HEAD@{2}: reset: moving to HEAD~1
ghi9012 HEAD@{3}: reset: moving to HEAD~1
def5678 HEAD@{4}: commit (amend): 初期コミットを修正
abc1234 HEAD@{5}: commit: 初期コミット

マージコミットが生成され、HEAD@{0}にその情報が記録されています。

リベース(git rebase)

git rebaseは、コミット履歴を直線的に整理するためのコマンドです。リベースを行うと、新しいコミットが再適用され、reflogにもその操作が記録されます。

git rebase main
git reflog

出力例:

stu9012 HEAD@{0}: rebase finished: returning to refs/heads/feature
vwx2345 HEAD@{1}: rebase: updating HEAD
pqr6789 HEAD@{2}: merge feature: Merge made by the 'recursive' strategy.
mno3456 HEAD@{3}: checkout: moving from master to feature
jkl3456 HEAD@{4}: reset: moving to HEAD~1
ghi9012 HEAD@{5}: reset: moving to HEAD~1
def5678 HEAD@{6}: commit (amend): 初期コミットを修正
abc1234 HEAD@{7}: commit: 初期コミット

リベース操作により、HEAD@{0}にリベース完了のエントリが追加されています。

チェリーピック(git cherry-pick)

git cherry-pickは、特定のコミットを別のブランチに適用するコマンドです。この操作もreflogに記録されます。

git cherry-pick abc1234
git reflog

出力例:

yz12345 HEAD@{0}: cherry-pick: 初期コミット
stu9012 HEAD@{1}: rebase finished: returning to refs/heads/feature
vwx2345 HEAD@{2}: rebase: updating HEAD
pqr6789 HEAD@{3}: merge feature: Merge made by the 'recursive' strategy.
mno3456 HEAD@{4}: checkout: moving from master to feature
jkl3456 HEAD@{5}: reset: moving to HEAD~1
ghi9012 HEAD@{6}: reset: moving to HEAD~1
def5678 HEAD@{7}: commit (amend): 初期コミットを修正
abc1234 HEAD@{8}: commit: 初期コミット

チェリーピックによって、新しいコミットyz12345が作成され、reflogに記録されています。

リセットの取り消し

誤ってリセットを行った場合でも、git reflogを使って元に戻すことが可能です。

git reflog
git reset --hard HEAD@{1}

出力例:

uvw6789 HEAD@{0}: reset: moving to HEAD@{1}
yz12345 HEAD@{1}: cherry-pick: 初期コミット
stu9012 HEAD@{2}: rebase finished: returning to refs/heads/feature
vwx2345 HEAD@{3}: rebase: updating HEAD
pqr6789 HEAD@{4}: merge feature: Merge made by the 'recursive' strategy.
mno3456 HEAD@{5}: checkout: moving from master to feature
jkl3456 HEAD@{6}: reset: moving to HEAD~1
ghi9012 HEAD@{7}: reset: moving to HEAD~1
def5678 HEAD@{8}: commit (amend): 初期コミットを修正
abc1234 HEAD@{9}: commit: 初期コミット

この例では、HEAD@{0}でリセットを行った後、HEAD@{1}に戻すことでリセット前の状態に復元しています。

まとめ

git reflogは、Gitの操作履歴を詳細に記録しており、誤った操作を取り消す際に非常に役立ちます。特に、addcommitresetといった基本的なコマンドの操作がどのようにreflogに反映されるかを理解することで、Gitの操作に対する自信が深まります。

実際のプロジェクトでこれらのreflogの例を参考にしながら操作を行うことで、Gitの仕組みをより深く理解できるでしょう。継続的にreflogを活用し、バージョン管理をより効果的に行ってください。


参考資料