Git の履歴でファイルが名前変更されたかどうかを確認する方法

GitGitBeginner
今すぐ練習

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

はじめに

この実験では、Git でファイルが名前を変更された後でも、そのファイルの履歴を効果的に追跡する方法を学びます。名前の変更をまたいでファイルの履歴を追跡するために、強力な git log --follow コマンドを調べます。

また、git diff --name-status を使ってコミット間のファイルの状態を調べる方法も学びます。最後に、名前を変更されていないファイルにこれらの手法を適用し、出力の違いを理解します。


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/BasicOperationsGroup -.-> git/diff("Compare Changes") git/BranchManagementGroup -.-> git/log("Show Commits") subgraph Lab Skills git/add -.-> lab-560030{{"Git の履歴でファイルが名前変更されたかどうかを確認する方法"}} git/status -.-> lab-560030{{"Git の履歴でファイルが名前変更されたかどうかを確認する方法"}} git/commit -.-> lab-560030{{"Git の履歴でファイルが名前変更されたかどうかを確認する方法"}} git/diff -.-> lab-560030{{"Git の履歴でファイルが名前変更されたかどうかを確認する方法"}} git/log -.-> lab-560030{{"Git の履歴でファイルが名前変更されたかどうかを確認する方法"}} end

git log --follow を実行する - ファイル

このステップでは、特定のファイルが名前を変更された場合でも、その履歴を追跡する方法を調べます。このときに便利なのが git log --follow コマンドです。

まず、プロジェクトディレクトリにいることを確認しましょう。

cd ~/project/my-time-machine

次に、新しいファイルを作成し、内容を追加しましょう。

echo "This is the original content." > original_file.txt

このファイルを追加してコミットします。

git add original_file.txt
git commit -m "Add original file"

以下のような出力が表示されるはずです。

[master 1a2b3c4] Add original file
 1 file changed, 1 insertion(+)
 create mode 100644 original_file.txt

次に、ファイルの名前を変更しましょう。

git mv original_file.txt renamed_file.txt

変更を確認するためにステータスをチェックします。

git status

以下のような表示がされるはずです。

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        renamed: original_file.txt -> renamed_file.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        message.txt

名前の変更をコミットします。

git commit -m "Rename original file"

以下のような出力が表示されるはずです。

[master 5d6e7f8] Rename original file
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename original_file.txt -> renamed_file.txt (100%)

次に、git log を使って名前を変更したファイルの履歴を表示しましょう。

git log renamed_file.txt

これでは、ファイルの名前が変更されたコミットのみが表示されます。名前変更前の履歴を表示するには、--follow オプションを使用する必要があります。

git log --follow renamed_file.txt

このコマンドを使うと、ファイルの名前の変更を追跡して、その履歴を表示します。「Rename original file」のコミットと「Add original file」のコミットの両方が表示されるはずです。

git log --follow コマンドは、リポジトリ内で移動または名前変更されたファイルの完全な履歴を理解する必要があるときに不可欠です。現在の名前に関係なく、異なるコミット間でファイルの進化を追跡するのに役立ちます。

git diff --name-status を使用する

このステップでは、git diff --name-status を使ってコミット間の変更の概要を確認する方法を学びます。特に、変更されたファイルの状態と名前に焦点を当てます。

まず、正しいディレクトリにいることを確認しましょう。

cd ~/project/my-time-machine

renamed_file.txt にさらに変更を加えましょう。

echo "Adding a new line." >> renamed_file.txt

次に、ステータスを確認します。

git status

renamed_file.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:   renamed_file.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        message.txt

no changes added to commit (use "git add" and/or "git commit -a")

この変更をステージングエリアに追加します。

git add renamed_file.txt

次に、git diff --name-status を使って、最後のコミットとステージングされた変更の間の差分を確認しましょう。

git diff --name-status --cached

--cached オプションは、git diff にステージングされた変更(インデックス)と最後のコミット(HEAD)を比較するよう指示します。

以下のような出力が表示されるはずです。

M       renamed_file.txt

出力 M renamed_file.txt は、renamed_file.txt が**変更(Modified)**されたことを示しています。

次に、この変更をコミットしましょう。

git commit -m "Add new line to renamed file"

以下のような出力が表示されるはずです。

[master 9h0i1j2] Add new line to renamed file
 1 file changed, 1 insertion(+)

git diff --name-status コマンドは、Git の履歴における異なるポイント間で、どのような種類の変更(追加、変更、削除、名前変更、コピー)が行われたかを、変更内容の詳細を表示せずに迅速に把握するのに非常に便利です。これは、コミット前に変更をレビューするときや、ブランチを比較するときに特に役立ちます。

名前を変更していないファイルのテスト

このステップでは、git log --follow が名前を変更していないファイルに対してどのように動作するかを見ていきます。これにより、--follow オプションが必要な状況をより深く理解することができます。

まず、正しいディレクトリにいることを確認しましょう。

cd ~/project/my-time-machine

リポジトリには既に renamed_file.txtmessage.txt があります。message.txt に内容を追加しましょう。

echo "This is a message." >> message.txt

ステータスを確認します。

git status

message.txt が変更され、renamed_file.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")

message.txt の変更を追加してコミットします。

git add message.txt
git commit -m "Add content to message file"

以下のような出力が表示されるはずです。

[master 3k4l5m6] Add content to message file
 1 file changed, 1 insertion(+)

次に、message.txt に対して git log を実行しましょう。

git log message.txt

これにより、message.txt の履歴が表示されます。「Add content to message file」のコミットと、message.txt が作成された最初のコミット(最初の実験でのもの)が表示されるはずです。

次に、message.txt に対して git log --follow を試してみましょう。

git log --follow message.txt

出力が git log message.txt と同じであることに気づくでしょう。これは、message.txt が名前を変更されたり移動されたりしていないからです。--follow オプションは、名前の変更を伴うファイルの履歴を追跡するために特別に設計されています。名前を変更していないファイルには、git log で十分です。

このステップでは、git log --follow が名前を変更したファイルの追跡に強力である一方で、名前を維持しているファイルには標準の git log コマンドで完全な履歴を取得できることを示しています。この違いを理解することで、タスクに適したコマンドを選ぶことができます。

まとめ

この実験では、Git でファイルの名前を変更した後でもその履歴を追跡する方法を学びました。まず、ファイルを作成し、追加してコミットし、次に git mv を使用してファイル名を変更し、その変更をコミットしました。その後、新しいファイル名に対して単純な git log を実行すると、名前変更以降の履歴のみが表示されることを示しました。

重要なポイントは、git log --follow <filename> コマンドの使用です。この強力なオプションを使用すると、Git はファイルの名前変更をまたいでその履歴を追跡でき、作成から現在の状態までの完全な進化の様子を把握することができます。これは、プロジェクトの履歴の中でファイルの変更の完全な文脈を理解するために重要です。