简介
在这个实验中,你将学习如何检查特定的 Git 提交中是否添加了文件。你将探索不同的 Git 命令,以检查提交细节并识别新添加的文件。
你将首先使用 git show --name-status
查看提交中更改的简洁摘要,特别关注表示添加文件的 'A' 状态。然后,你将学习如何使用带有相关选项的 git diff-tree
来实现类似的结果,这在脚本编写和高级场景中特别有用。最后,你将区分提交历史中修改过的文件和新添加的文件。
在这个实验中,你将学习如何检查特定的 Git 提交中是否添加了文件。你将探索不同的 Git 命令,以检查提交细节并识别新添加的文件。
你将首先使用 git show --name-status
查看提交中更改的简洁摘要,特别关注表示添加文件的 'A' 状态。然后,你将学习如何使用带有相关选项的 git diff-tree
来实现类似的结果,这在脚本编写和高级场景中特别有用。最后,你将区分提交历史中修改过的文件和新添加的文件。
在这一步中,我们将探索如何查看特定提交的详细信息,包括哪些文件被更改以及如何更改。我们将使用带有 --name-status
选项的 git show
命令。
首先,确保你位于 my-time-machine
目录中:
cd ~/project/my-time-machine
现在,让我们使用 git show
来查看我们在上一个实验中所做的提交。我们可以使用 HEAD
别名来引用最近的提交:
git show --name-status HEAD
你应该会看到类似以下的输出:
commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 (HEAD -> master)
Author: Jane Doe <[email protected]>
Date: Mon Aug 7 10:00:00 2023 +0000
Send a message to the future
A message.txt
让我们来分析一下这个输出:
git log
时看到的内容。A message.txt
这一行是这里的关键部分。
A
代表 "Added"(已添加)。这告诉我们文件 message.txt
是在这次提交中添加的。message.txt
是受影响的文件的名称。--name-status
选项非常有用,因为它能简洁地总结一次提交所引入的更改,仅显示文件的名称及其状态(已添加、已修改、已删除等)。如果你只想知道涉及哪些文件,这比查看完整的差异要快得多。
理解如何检查提交对于浏览项目历史以及了解项目的演变过程至关重要。
在这一步中,我们将使用另一个命令 git diff-tree
来查看一次提交所引入的更改。虽然 git show
非常适合查看完整的提交细节和差异,但 git diff-tree
在脚本编写和更高级的场景中很有用。
确保你仍然位于 ~/project/my-time-machine
目录中。
我们将使用带有 -r
(递归)和 --name-status
选项的 git diff-tree
命令,后面跟上提交哈希。你可以从 git log
或 git show
的输出中获取提交哈希。对于我们的第一次提交,我们也可以使用 HEAD
。
git diff-tree -r --name-status HEAD
你应该会看到类似以下的输出:
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 A message.txt
让我们来分析一下这个输出:
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9
是提交哈希。A
表示文件更改的状态(已添加)。message.txt
是文件的名称。这个输出与 git show
的 --name-status
部分非常相似。对于像我们第一次提交这样简单的提交(仅添加了一个文件),输出几乎相同。然而,git diff-tree
更灵活,可以用于比较仓库中的不同树(快照),而不仅仅是提交。
目前,关键要点是 git show --name-status
和 git diff-tree -r --name-status
都可以显示在给定提交中哪些文件被更改以及如何更改。这是理解项目历史的一项基本技能。
在前面的步骤中,我们了解了 git show --name-status
和 git diff-tree --name-status
如何对新增文件显示 A
。现在,让我们看看当文件被修改时,它们的表现如何。
首先,确保你位于 ~/project/my-time-machine
目录中。
让我们在 message.txt
文件中再添加一行内容:
echo "Hello again, Future Me" >> message.txt
>>
操作符用于将文本追加到现有文件中。
现在,让我们检查仓库的状态:
git status
你应该会看到表明 message.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")
Git 正确识别出文件已被 修改
。
现在,让我们将这个更改暂存:
git add message.txt
然后再次检查状态:
git status
现在输出应该显示更改已被暂存:
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: message.txt
请注意,尽管我们添加了内容,但 Git 将此文件标记为 修改
,因为该文件在上一次提交中已经存在。
最后,让我们提交这个更改:
git commit -m "Add another message to the future"
你应该会看到确认提交的输出:
[master a1b2c3d] Add another message to the future
1 file changed, 1 insertion(+)
现在我们有了一个新的提交。让我们对最新的提交(HEAD
)使用 git show --name-status
来查看状态:
git show --name-status HEAD
输出将类似于以下内容:
commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 (HEAD -> master)
Author: Jane Doe <[email protected]>
Date: Mon Aug 7 10:05:00 2023 +0000
Add another message to the future
M message.txt
注意 message.txt
前面的 M
。这表明该文件在这次提交中被 修改
了。
同样,如果你使用 git diff-tree -r --name-status HEAD
,你也会看到 M
状态。
A
(新增)和 M
(修改)之间的这种区别对于理解 Git 中文件的历史记录非常重要。A
表示文件是在该提交中创建的,而 M
表示文件之前就已存在,只是其内容被更改了。
在本次实验中,我们学习了如何检查一个文件是否在 Git 提交中被添加。我们首先探究了 git show --name-status
命令,该命令能简洁地总结一次提交中的更改,包括状态(如用 'A' 表示新增)和受影响文件的名称。这是一种快速查看哪些文件参与了一次提交的方法,而无需查看完整的差异内容。
接着,我们介绍了带有 -r
和 --name-status
选项的 git diff-tree
命令,它是检查提交更改的另一种方法,尤其适用于脚本编写和高级场景。虽然没有详细介绍这一步的具体内容,但该介绍表明其目的是进一步探索如何使用不同的 Git 命令来识别提交中新增的文件。