如何检查文件在 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 已被 修改

现在,提交此更改。

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 跟踪文件在重命名过程中的历史记录,完整呈现文件从创建到当前状态的演变过程。这对于理解项目历史中文件修改的完整背景至关重要。