如何检查 Git 提交是否修改了特定文件

GitGitBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何检查特定的 Git 提交是否修改了某个特定文件。我们将探索两种不同的方法来实现这一目标:使用 git show --name-only 命令快速查看更改的文件,以及使用更基础的 git diff-tree 命令并结合相关选项来识别提交中的文件修改情况。

通过实际操作示例,你将了解这些命令如何提供有关提交所引入更改的有价值信息,帮助你理解 Git 仓库中历史提交的范围和影响。我们还将使用未修改的文件对这些方法进行测试,以巩固你的理解。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git/BasicOperationsGroup -.-> git/diff("Compare Changes") git/BranchManagementGroup -.-> git/log("Show Commits") subgraph Lab Skills git/diff -.-> lab-560068{{"如何检查 Git 提交是否修改了特定文件"}} git/log -.-> lab-560068{{"如何检查 Git 提交是否修改了特定文件"}} end

运行 git show --name-only

在这一步中,你将探索如何使用 git show 命令查看特定提交的信息。这个命令在检查提交的详细信息(包括其所引入的更改)时非常有用。

你将结合 git show 使用 --name-only 选项。该选项会让 Git 仅显示提交中被更改的文件的名称,这是一种快速查看哪些文件受到影响的方法。

首先,确保你处于项目目录中。打开终端并导航到 my-time-machine 目录:

cd ~/project/my-time-machine

现在,结合 --name-only 选项使用 git show 命令,查看最后一次提交中更改的文件。请记住,你最后一次提交是添加 message.txt 的那次。

git show --name-only HEAD

在这里,HEAD 是 Git 中的一个特殊指针,它指向当前分支的最新提交。

你应该会看到类似于以下的输出:

commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9
Author: Jane Doe <[email protected]>
Date:   Mon Aug 7 10:00:00 2023 +0000

    Send a message to the future

message.txt

输出显示了提交的详细信息(提交哈希、作者、日期和提交信息),随后是该提交中被更改的文件的名称,即 message.txt

使用 git show --name-only 是一种快速获取特定提交中哪些文件被修改的摘要信息的方法,而无需查看完整的差异(文件内的实际更改)。当你只想了解提交的范围时,这非常有帮助。

使用 git diff-tree 查看文件更改

在这一步中,你将探索另一种查看提交中更改文件的方法,即使用 git diff-tree 命令。虽然 git show --name-only 是一种常用方法,但 git diff-tree 是一个更基础的命令,用于显示两个树对象(代表项目在特定提交时的状态)之间的差异。

你将结合 -r--name-only 选项使用 git diff-tree 命令。-r 选项使该命令具有递归性,意味着它会深入到子目录中查找。--name-only 选项与 git show 中的该选项类似,仅会列出有差异的文件的名称。

首先,确保你位于 my-time-machine 目录中:

cd ~/project/my-time-machine

现在,使用 git diff-tree 查看最新提交中更改的文件。你需要该提交的哈希值(唯一标识符)。你可以从 git loggit show 的输出中获取这个值。对于第一次提交,你也可以使用 HEAD

git diff-tree -r --name-only HEAD

你应该会看到类似于以下的输出:

message.txt

这个输出比 git show --name-only 的输出更简洁,因为 git diff-tree 主要专注于显示树之间的差异,而不是完整的提交详细信息。当与 --name-only 选项一起使用时,它只会列出在提交的父提交和该提交本身之间被添加、删除或修改的文件。由于第一次提交没有父提交,所以它显示的是该提交中添加的文件。

理解 git diff-tree 很有用,因为它是一个底层命令,其他 Git 命令在内部经常会使用它。这有助于你理解 Git 是如何跟踪项目不同版本之间的更改的。

对未修改文件进行测试

在前面的步骤中,你已经了解了 git show --name-onlygit diff-tree -r --name-only 如何显示特定提交中更改的文件。现在,让我们看看当你在一个没有文件被修改的提交上运行这些命令时会发生什么(在我们目前只有一个提交的情况下并非如此,但你可以模拟这种情况)。

由于当前仓库只有一个添加了文件的提交,在该提交上运行这些命令总会显示 message.txt。为了说明“仅显示修改过的文件”这一概念,假设你有一个没有更改任何文件的提交(这种情况通常发生在合并提交或仅更改元数据的提交中,但在这个练习中,你将关注没有列出文件时的输出)。

如果你在一个没有修改任何文件的提交上运行 git show --name-onlygit diff-tree -r --name-only,文件名部分的输出将为空。

让我们重新运行之前学过的命令来强化这个概念。确保你位于 my-time-machine 目录中:

cd ~/project/my-time-machine

再次运行 git show --name-only

git show --name-only HEAD

输出将类似于:

commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9
Author: Jane Doe <[email protected]>
Date:   Mon Aug 7 10:00:00 2023 +0000

    Send a message to the future

message.txt

现在再次运行 git diff-tree -r --name-only

git diff-tree -r --name-only HEAD

输出将是:

message.txt

这两个命令都正确显示了 message.txt,因为该文件是在这个提交中引入的。这里的关键要点是,这些命令旨在仅列出指定提交中被更改(添加、删除或修改)的文件。如果一个提交没有更改任何文件,这些命令(特别是文件列表部分)将不会显示任何内容。

这种行为对于理解一个提交所引入的更改范围很重要。它能帮助你快速识别项目的哪些部分受到了特定更改的影响。

总结

在这个实验中,你学习了如何查看特定 Git 提交中哪些文件被修改了。你探索了两种主要方法:使用 git show --name-only 以及结合 -r--name-only 选项使用 git diff-tree

你首先使用 git show --name-only HEAD 快速查看了最新提交中更改的文件名称,展示了该命令在简洁概览方面的实用性。随后,你引入了更基础的命令 git diff-tree,并结合 -r--name-only 选项实现了类似的结果,强调了它用于比较树对象的底层机制。最后,你用未修改特定文件的提交对这些命令进行了测试,以确认它们的行为并加深理解。