はじめに
この実験では、特定の Git コミットが特定のファイルを変更したかどうかを確認する方法を学びます。これを達成するために、2 つの異なる方法を探ります。1 つは、変更されたファイルの概要をすばやく確認するための git show --name-only コマンドを使用する方法で、もう 1 つは、コミット内のファイルの変更を特定するために関連するオプションを使用した、より基本的な git diff-tree コマンドを利用する方法です。
実践的な例を通じて、これらのコマンドがコミットによって導入された変更に関する貴重な洞察を提供し、Git リポジトリ内の過去のコミットの範囲と影響を理解するのにどのように役立つかを見ていきます。また、理解を深めるために、変更されていないファイルでこれらの方法をテストします。
git show --name-only を実行する
このステップでは、git show コマンドを使用して特定のコミットに関する情報を表示する方法を探ります。このコマンドは、コミットによって導入された変更を含むコミットの詳細を調べるのに非常に便利です。
git show とともに --name-only オプションを使用します。このオプションは、Git にコミットで変更されたファイルの名前のみを表示するよう指示します。これは、どのファイルが影響を受けたかをすばやく確認する方法です。
まず、プロジェクトディレクトリにいることを確認しましょう。ターミナルを開き、my-time-machine ディレクトリに移動します。
cd ~/project/my-time-machine
次に、--name-only オプションを使用して git show を実行し、最後のコミットで変更されたファイルを確認しましょう。最後のコミットは、message.txt を追加したコミットです。
git show --name-only HEAD
ここで、HEAD は Git の特殊なポインタで、現在のブランチの最新のコミットを指します。
以下のような出力が表示されるはずです。
commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9
Author: Jane Doe <jane.doe@example.com>
Date: Mon Aug 7 10:00:00 2023 +0000
Send a message to the future
message.txt
この出力には、コミットの詳細(コミットハッシュ、作者、日付、メッセージ)が表示され、その後にこのコミットで変更されたファイルの名前 message.txt が表示されます。
git show --name-only を使用すると、ファイル内の実際の変更(完全な差分)を見ることなく、特定のコミットで変更されたファイルの概要をすばやく取得できます。これは、コミットの範囲を知りたいだけの場合に便利です。
git diff-tree を使ってファイルの変更を確認する
このステップでは、git diff-tree コマンドを使用して、コミットで変更されたファイルを確認する別の方法を探ります。git show --name-only は一般的な方法ですが、git diff-tree は、2 つのツリーオブジェクト(特定のコミット時点でのプロジェクトの状態を表す)間の差分を表示する、より基本的なコマンドです。
git diff-tree とともに -r および --name-only オプションを使用します。-r オプションは、コマンドを再帰的に実行するようにします。つまり、サブディレクトリも調べます。--name-only オプションは、git show と同様に、異なるファイルの名前のみをリストします。
まず、my-time-machine ディレクトリにいることを確認しましょう。
cd ~/project/my-time-machine
次に、git diff-tree を使用して、最新のコミットで変更されたファイルを確認しましょう。コミットのハッシュ(一意の識別子)が必要です。これは、git log または git show の出力から取得できます。最初のコミットの場合は、HEAD を使用することもできます。
git diff-tree -r --name-only HEAD
以下のような出力が表示されるはずです。
message.txt
この出力は git show --name-only よりもシンプルです。なぜなら、git diff-tree は主にツリー間の差分を表示することに焦点を当てており、コミットの詳細全体を表示するわけではないからです。--name-only とともに使用すると、コミットの親とコミット自体の間で追加、削除、または変更されたファイルのみがリストされます。最初のコミットには親がないため、そのコミットで追加されたファイルが表示されます。
git diff-tree を理解することは有用です。なぜなら、これは他の Git コマンドが内部でよく使用する低レベルのコマンドだからです。これにより、Git がプロジェクトの異なるバージョン間の変更を追跡する仕組みを理解するのに役立ちます。
変更されていないファイルでテストする
前のステップでは、git show --name-only と git diff-tree -r --name-only が特定のコミットで変更されたファイルを表示する方法を見ました。では、ファイルが変更されていないコミットに対してこれらのコマンドを実行するとどうなるか見てみましょう(現時点での単一のコミットではこの状況はないですが、概念をシミュレートできます)。
現在のリポジトリには、ファイルが追加されたコミットが 1 つしかないため、そのコミットに対してこれらのコマンドを実行すると、常に message.txt が表示されます。変更された ファイルのみを表示する概念を説明するために、ファイルを一切変更しないコミットがあったと想像してみましょう(これは通常、マージコミットやメタデータのみを変更するコミットで起こりますが、この演習では、ファイルがリストされない場合の出力に焦点を当てます)。
ファイルを一切変更しないコミットに対して git show --name-only または git diff-tree -r --name-only を実行すると、ファイル名の部分の出力は空になります。
概念を強化するために、学んだコマンドを再度実行しましょう。my-time-machine ディレクトリにいることを確認します。
cd ~/project/my-time-machine
再度 git show --name-only を実行します。
git show --name-only HEAD
出力は以下のようになります。
commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9
Author: Jane Doe <jane.doe@example.com>
Date: Mon Aug 7 10:00:00 2023 +0000
Send a message to the future
message.txt
次に、再度 git diff-tree -r --name-only を実行します。
git diff-tree -r --name-only HEAD
出力は以下のようになります。
message.txt
両方のコマンドとも正しく message.txt を表示します。なぜなら、そのファイルはこのコミットで導入されたからです。ここで重要なのは、これらのコマンドは指定されたコミットで変更された(追加、削除、または修正された)ファイルのみをリストするように設計されているということです。コミットがファイルを一切変更しない場合、これらのコマンド(具体的にはファイルリストの部分)は何も表示しません。
この動作は、コミットによって導入された変更の範囲を理解するために重要です。特定の変更がプロジェクトのどの部分に影響を与えたかをすばやく識別するのに役立ちます。
まとめ
この実験では、特定の Git コミットでどのファイルが変更されたかを確認する方法を学びました。主に 2 つの方法を探りました。1 つは git show --name-only を使用する方法で、もう 1 つは -r および --name-only オプションを使用した git diff-tree を使う方法です。
まず、git show --name-only HEAD を使用して、最新のコミットで変更されたファイルの名前をすばやく確認し、このコマンドが簡潔な概要を提供する有用性を示しました。その後、より基本的なコマンドである git diff-tree を紹介し、-r および --name-only オプションを使用して同様の結果を得ました。これにより、ツリーオブジェクトを比較する基本的な仕組みを強調しました。最後に、特定のファイルを変更しないコミットに対してこれらのコマンドをテストし、その動作を確認し理解を深めました。



