简介
在这个实验中,你将学习如何在 Git 中有效跟踪文件的历史记录,即使该文件已被重命名。我们将探索强大的 git log --follow
命令,以跟踪文件在重命名过程中的历史记录。
你还将学习如何使用 git diff --name-status
来检查提交之间文件的状态。最后,我们将在未重命名的文件上测试这些技术,以了解输出的差异。
在这个实验中,你将学习如何在 Git 中有效跟踪文件的历史记录,即使该文件已被重命名。我们将探索强大的 git log --follow
命令,以跟踪文件在重命名过程中的历史记录。
你还将学习如何使用 git diff --name-status
来检查提交之间文件的状态。最后,我们将在未重命名的文件上测试这些技术,以了解输出的差异。
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.txt
和 message.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 跟踪文件在重命名过程中的历史记录,完整呈现文件从创建到当前状态的演变过程。这对于理解项目历史中文件修改的完整背景至关重要。