Git のコミットが修正されたかどうかを確認する方法

GitGitBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Git のコミットが修正 (amend) されたかどうかを判断する方法を学びます。参照更新の履歴を表示する git reflog コマンドを調べ、修正操作を明らかにします。

また、git log を使ってコミットを比較し、修正されたコミットと修正されていないコミットの違いを理解する方法も学び、リポジトリの履歴を調べる実践的なスキルを身につけます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git/BasicOperationsGroup -.-> git/add("Stage Files") git/BasicOperationsGroup -.-> git/status("Check Status") git/BasicOperationsGroup -.-> git/commit("Create Commit") git/BranchManagementGroup -.-> git/log("Show Commits") git/BranchManagementGroup -.-> git/reflog("Log Ref Changes") subgraph Lab Skills git/add -.-> lab-560069{{"Git のコミットが修正されたかどうかを確認する方法"}} git/status -.-> lab-560069{{"Git のコミットが修正されたかどうかを確認する方法"}} git/commit -.-> lab-560069{{"Git のコミットが修正されたかどうかを確認する方法"}} git/log -.-> lab-560069{{"Git のコミットが修正されたかどうかを確認する方法"}} git/reflog -.-> lab-560069{{"Git のコミットが修正されたかどうかを確認する方法"}} end

修正 (amend) エントリを git reflog で確認する

このステップでは、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)」操作後にコミットハッシュが変化することに注意してください。
  • コミットハッシュの後のテキストは、commitinitial commit (amend)commit (initial) などの操作を説明しています。

git reflog は、失われたコミットを復元したり、リポジトリの現在の状態に至るまでの操作の順序を理解したりするための強力なツールです。HEAD がどこにあったかを表示します。たとえそれらのコミットがブランチの履歴に含まれなくなっている場合 (例えば、修正 (amend) やリベース (rebase) の後) でもです。

上記の出力例では、initial commit (amend) のようなエントリがあります。これは、最初のコミットが修正されたことを示しています。コミットを修正すると、最後のコミットが、ステージングされた変更を含む新しいコミットに置き換えられます。git log は最終的な修正後のコミットのみを表示しますが、git reflog は元の最初のコミットと修正後のコミットの両方を表示します。

git reflog を理解することは、特に git commit --amend のような履歴を書き換えるコマンドを使用する場合、プロジェクトの履歴を操作する上で重要です。

git log を使ってコミットを比較する

このステップでは、git log コマンドを使ってコミット履歴を表示し、特に git commit --amend を使用した後の git loggit 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 loggit reflog の重要な違いです。git log は現在のブランチの先端から到達可能なコミットの履歴を表示し、git reflogHEAD やその他の参照が指していた場所の履歴を表示します。

git log はプロジェクトの公式な公開履歴であり、git reflog はリポジトリで行ったすべての操作の個人用の日記のようなものだと考えてください。

また、git log を使って異なるコミットを比較することもできます。現時点では履歴に 1 つのコミットしかないため、複数のコミットがある実際のプロジェクトでは、git log commit1..commit2 のようなコマンドを使って履歴内の 2 つの特定のポイント間のコミットを表示したり、git diff commit1 commit2 を使って 2 つのコミット間で導入された正確な変更を表示したりできます。

現時点では、git log がコミット履歴を表示し、git reflog が参照更新の履歴を表示することを理解することが重要です。

修正 (amend) していないコミットをテストする

このステップでは、--amend フラグを使用せずに新しいコミットを作成し、それが git loggit 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 loggit reflog の両方に新しいコミットが表示されますが、git refloggit log には表示されない修正されたコミットの履歴を保持し続けることを示しています。

まとめ

この実験では、Git のコミットが修正 (amend) されたかどうかを確認する方法を学びました。git reflog コマンドを調査しました。このコマンドは HEAD などの参照の更新履歴を提供し、コミットの修正などの操作を確認することができます。reflog の出力を調べることで、修正操作を示すエントリを特定し、そのような操作後のコミットハッシュの変化を観察することができます。

また、git reflog は、git log を通じて直接アクセスできなくなったコミットでも、リポジトリ内の操作の順序を理解するための貴重なツールであることも学びました。これは、失われた作業を回復したり、リポジトリの履歴に関する問題を診断したりするのに役立ちます。