はじめに
この実験では、Git のコミットが修正 (amend) されたかどうかを判断する方法を学びます。参照更新の履歴を表示する git reflog
コマンドを調べ、修正操作を明らかにします。
また、git log
を使ってコミットを比較し、修正されたコミットと修正されていないコミットの違いを理解する方法も学び、リポジトリの履歴を調べる実践的なスキルを身につけます。
この実験では、Git のコミットが修正 (amend) されたかどうかを判断する方法を学びます。参照更新の履歴を表示する git reflog
コマンドを調べ、修正操作を明らかにします。
また、git log
を使ってコミットを比較し、修正されたコミットと修正されていないコミットの違いを理解する方法も学び、リポジトリの履歴を調べる実践的なスキルを身につけます。
このステップでは、git reflog
コマンドを調べ、コミットの修正 (amend) などの操作を含むリポジトリの履歴を確認する方法を学びます。
まず、プロジェクトディレクトリにいることを確認しましょう。ターミナルを開き、my-time-machine
ディレクトリに移動します。
cd ~/project/my-time-machine
次に、git reflog
コマンドを使ってリポジトリの履歴を確認しましょう。reflog
(参照ログ) は、リポジトリ内のブランチの先端やその他の参照の更新を記録します。これは、コミット履歴を表示する git log
とは異なります。
次のコマンドを入力します。
git reflog
以下のような出力が表示されるはずです。
a1b2c3d (HEAD -> master) HEAD@{0}: commit: Send a message to the future
a1b2c3d (HEAD -> master) HEAD@{1}: initial commit (amend): Send a message to the future
e4f5g6h HEAD@{2}: commit (initial): Send a message to the future
この出力を分解してみましょう。
HEAD
) を更新した操作を表しています。HEAD@{0}
は最も新しい操作で、HEAD@{1}
はその前の操作、といった具合です。a1b2c3d
, e4f5g6h
) はコミットハッシュです。「修正 (amend)」操作後にコミットハッシュが変化することに注意してください。commit
、initial commit (amend)
、commit (initial)
などの操作を説明しています。git reflog
は、失われたコミットを復元したり、リポジトリの現在の状態に至るまでの操作の順序を理解したりするための強力なツールです。HEAD
がどこにあったかを表示します。たとえそれらのコミットがブランチの履歴に含まれなくなっている場合 (例えば、修正 (amend) やリベース (rebase) の後) でもです。
上記の出力例では、initial commit (amend)
のようなエントリがあります。これは、最初のコミットが修正されたことを示しています。コミットを修正すると、最後のコミットが、ステージングされた変更を含む新しいコミットに置き換えられます。git log
は最終的な修正後のコミットのみを表示しますが、git reflog
は元の最初のコミットと修正後のコミットの両方を表示します。
git reflog
を理解することは、特に git commit --amend
のような履歴を書き換えるコマンドを使用する場合、プロジェクトの履歴を操作する上で重要です。
このステップでは、git log
コマンドを使ってコミット履歴を表示し、特に git commit --amend
を使用した後の git log
と git reflog
の違いを理解します。
まだ ~/project/my-time-machine
ディレクトリにいることを確認してください。
次に、git log
を使ってコミット履歴を表示しましょう。
git log --oneline
--oneline
オプションを使用すると、コミット履歴を簡潔に表示でき、各コミットが 1 行で表示されます。
以下のような出力が表示されるはずです。
a1b2c3d (HEAD -> master) Send a message to the future
この出力を前のステップでの git reflog
の出力と比較してみてください。git log
は最終的な修正後のコミットのみを表示し、修正操作によって置き換えられた元の最初のコミットは表示されないことに注意してください。
これが git log
と git reflog
の重要な違いです。git log
は現在のブランチの先端から到達可能なコミットの履歴を表示し、git reflog
は HEAD
やその他の参照が指していた場所の履歴を表示します。
git log
はプロジェクトの公式な公開履歴であり、git reflog
はリポジトリで行ったすべての操作の個人用の日記のようなものだと考えてください。
また、git log
を使って異なるコミットを比較することもできます。現時点では履歴に 1 つのコミットしかないため、複数のコミットがある実際のプロジェクトでは、git log commit1..commit2
のようなコマンドを使って履歴内の 2 つの特定のポイント間のコミットを表示したり、git diff commit1 commit2
を使って 2 つのコミット間で導入された正確な変更を表示したりできます。
現時点では、git log
がコミット履歴を表示し、git reflog
が参照更新の履歴を表示することを理解することが重要です。
このステップでは、--amend
フラグを使用せずに新しいコミットを作成し、それが git log
と git reflog
の両方にどのように表示されるかを観察します。これにより、これらのコマンドが履歴を異なる方法で追跡する仕組みを理解を深めることができます。
まず、message.txt
ファイルにさらに内容を追加しましょう。新しい行を追加します。
echo "Hello again, Future Me!" >> message.txt
>>
演算子は、テキストを既存のファイルに追記します。上書きするのではありません。
次に、変更を確認するためにステータスをチェックしましょう。
git status
message.txt
が変更されたことを示す出力が表示されるはずです。
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: message.txt
no changes added to commit (use "git add" and/or "git commit -a")
次に、変更をステージングする必要があります。
git add message.txt
そして、前のコミットを修正せずに新しいコミットを作成しましょう。
git commit -m "Add another message"
新しいコミットが作成されたことを確認する出力が表示されるはずです。
[master 1a2b3c4] Add another message
1 file changed, 1 insertion(+)
次に、再度 git log
をチェックしましょう。
git log --oneline
今回は、2 つのコミットが表示されるはずです。
1a2b3c4 (HEAD -> master) Add another message
a1b2c3d Send a message to the future
2 番目のコミットが 1 番目のコミットの上に追加され、ブランチの履歴が拡張されたため、両方のコミットが git log
に表示されます。
最後に、git reflog
をチェックしましょう。
git reflog
以下のような出力が表示されるはずです。
1a2b3c4 (HEAD -> master) HEAD@{0}: commit: Add another message
1a2b3c4 (HEAD -> master) HEAD@{1}: commit (amend): Send a message to the future
e4f5g6h HEAD@{2}: commit (initial): Send a message to the future
git reflog
はすべての操作を表示していることに注意してください。最初のコミット、修正された最初のコミット、そして新しく作成したコミットです。HEAD
を移動させた各操作が記録されています。
このステップでは、--amend
を使用せずに新しいコミットを作成すると、git log
と git reflog
の両方に新しいコミットが表示されますが、git reflog
は git log
には表示されない修正されたコミットの履歴を保持し続けることを示しています。
この実験では、Git のコミットが修正 (amend) されたかどうかを確認する方法を学びました。git reflog
コマンドを調査しました。このコマンドは HEAD
などの参照の更新履歴を提供し、コミットの修正などの操作を確認することができます。reflog
の出力を調べることで、修正操作を示すエントリを特定し、そのような操作後のコミットハッシュの変化を観察することができます。
また、git reflog
は、git log
を通じて直接アクセスできなくなったコミットでも、リポジトリ内の操作の順序を理解するための貴重なツールであることも学びました。これは、失われた作業を回復したり、リポジトリの履歴に関する問題を診断したりするのに役立ちます。