はじめに
この実験では、特定の Git コミットで特定のファイルが変更されたかどうかを確認する方法を学びます。これを実現するために、さまざまな Git コマンドを探索します。
まず、git show --name-only コマンドを使用して、コミットで変更されたファイルを表示します。次に、git diff-tree を使用して、コミット間のファイルの変更を調べる方法を学びます。最後に、変更されていないファイルでこれらの方法をテストし、その動作を確認します。
git show --name-only コマンドを使ったコミットの確認
このステップでは、特定のコミットに関する詳細情報を取得するために git show コマンドを使用する方法を学びます。git log はコミットの概要を表示しますが、git show を使うと、1 つのコミットの中身を詳しく見ることができます。
最初のコミットの詳細を見るために git show を使ってみましょう。また、そのコミットで変更されたファイルの名前のみを表示するために --name-only オプションも追加します。
まず、my-time-machine ディレクトリにいることを確認してください。
cd ~/project/my-time-machine
次に、--name-only オプション付きで git show コマンドを実行します。最新のコミットを参照するには HEAD を使用できます。
git show --name-only HEAD
以下のような出力が表示されるはずです。
commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 (HEAD -> master)
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 logで見たものと似ており、コミットの詳細(コミット ID、作者、日付、メッセージ)が表示されます。 - 最後の行の
message.txtは--name-onlyオプションの出力です。このコミットでmessage.txtファイルが変更されたことを示しています。
git show コマンドは個々のコミットを調べるのに非常に便利です。特定のコミットで行われた正確な変更内容、影響を受けたファイル、およびそれらの変更に関連付けられたコミットメッセージを確認することができます。これにより、プロジェクトの履歴を詳細に理解することができます。
次のステップでは、git diff-tree を使用してコミット間のファイルの変更を確認する別の方法を探索します。
ファイル変更の確認に git diff-tree を実行する
このステップでは、コミットで変更されたファイルを確認するための別のコマンド git diff-tree を探索します。このコマンドはスクリプトや自動化でよく使われますが、Git が変更を追跡する仕組みを理解するのにも役立ちます。
まだ ~/project/my-time-machine ディレクトリにいることを確認してください。
最初のコミットのコミット ID が必要です。git log --oneline を実行することで取得できます。
git log --oneline
以下のような出力が表示されるはずです(コミット ID は異なります)。
a1b2c3d (HEAD -> master) Send a message to the future
コミット ID の最初の 7 文字(例:a1b2c3d)をコピーします。
次に、git diff-tree コマンドを実行します。再帰的に変更を表示するために -r オプションを、ファイル名のみを表示するために --name-only オプションを使用します。YOUR_COMMIT_ID をコピーしたコミット ID に置き換えてください。
git diff-tree -r --name-only YOUR_COMMIT_ID
たとえば、コミット ID が a1b2c3d の場合、次のように実行します。
git diff-tree -r --name-only a1b2c3d
以下のような出力が表示されるはずです。
message.txt
このコマンドも、そのコミットで message.txt が変更されたことを示しています。
git show --name-only は対話的な使用には便利なことが多いですが、git diff-tree はツリー(プロジェクトのスナップショット)を比較する強力なコマンドで、より高度な Git ワークフローやスクリプトで頻繁に使用されます。Git がこれらのスナップショット間の変更を追跡する仕組みを理解することは、バージョン管理を習得するための重要なポイントです。
未変更ファイルのテスト
この最後のステップでは、Git が最後のコミット以降に変更されていないファイルを正しく識別することを確認します。これにより、Git が変更のみを追跡するという概念が強化されます。
~/project/my-time-machine ディレクトリにいることを確認してください。
再度 git status コマンドを実行します。
git status
以下のような出力が表示されるはずです。
On branch master
nothing to commit, working tree clean
このメッセージは、作業ディレクトリにコミットする必要のある変更がないことを示しています。Git は message.txt ファイルが最後のコミット時とまったく同じであることを認識しています。
次に、新しい追跡対象外のファイルを作成して、Git がどのように反応するかを見てみましょう。
echo "This is a temporary file" > temp.txt
再度 git status を実行します。
git status
今度は以下のように表示されるはずです。
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
temp.txt
nothing added to commit but untracked files present (use "git add" to track)
git add を使って Git に追跡を指示していないため、Git は temp.txt を追跡対象外のファイルとして正しく識別しています。これは、Git がディレクトリ内のファイルを認識しているが、リポジトリに追加したファイルのみを能動的に追跡することを示しています。
最後に、一時ファイルを削除しましょう。
rm temp.txt
最後に一度 git status を実行します。
git status
「nothing to commit, working tree clean」の状態に戻っているはずです。
このステップでは、Git がどのファイルが変更されたか、次のコミットの対象としてステージングされているか、追跡対象外のファイルはどれかを明確に表示することで、プロジェクトの管理を支援する方法を強調しています。この明確なステータス情報は、効果的なバージョン管理に不可欠です。
まとめ
この実験では、Git を使って特定のコミットでファイルが変更されたかどうかを確認する方法を学びました。まず、git show --name-only コマンドを使ってコミットの詳細を表示し、変更されたファイルの名前のみをリストアップしました。これにより、特定のコミットで影響を受けたファイルをすばやく確認することができました。
次に、コミット内のファイル変更を特定する別の方法として git diff-tree コマンドを探索しました。このコマンドはスクリプトでよく使われますが、git diff-tree を理解することは、Git が変更を追跡する仕組みを理解するのに役立ちます。これらのコマンドは、プロジェクトの履歴を調査し、個々のコミットで導入された変更を理解するための貴重なツールです。



