如何检查 Git 提交是否为空

GitGitBeginner
立即练习

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

简介

在本次实验中,我们将探讨如何判断一个 Git 提交是否为空,即该提交未对项目文件进行任何更改。我们将学习使用 git show 命令来检查特定提交的详细信息和更改内容,以直观呈现其具体内容。

此外,我们还将深入学习使用 git diff-tree 命令,这是一种更直接的编程方法,用于检查提交是否有相关更改。最后,我们将使用包含修改的常规提交和有意创建的空提交来测试这些技术,以巩固我们的理解。


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-560058{{"如何检查 Git 提交是否为空"}} git/status -.-> lab-560058{{"如何检查 Git 提交是否为空"}} git/commit -.-> lab-560058{{"如何检查 Git 提交是否为空"}} git/diff -.-> lab-560058{{"如何检查 Git 提交是否为空"}} git/log -.-> lab-560058{{"如何检查 Git 提交是否为空"}} end

运行 git show 检查更改

在这一步中,你将学习如何使用 git show 命令检查特定提交的详细信息。这个命令就像是打开一个时间胶囊,让你确切地看到那个时刻的具体内容。

首先,确保你位于项目目录中:

cd ~/project/my-time-machine

现在,使用 git show 查看你的第一次提交。你可以使用 git log 输出中的提交哈希(由字母和数字组成的长字符串),或者简单地使用 HEAD,它指的是当前分支上的最新提交。

git show 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

diff --git a/message.txt b/message.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/message.txt
@@ -0,0 +1 @@
+Hello, Future Me

下面来详细分析这个输出:

  • 第一部分与 git log 类似,显示提交信息(哈希、作者、日期、提交说明)。
  • diff 部分显示了该提交所引入的更改。
    • diff --git a/message.txt b/message.txt:表示 message.txt 文件在提交前后的状态差异。
    • new file mode 100644:表明 message.txt 是一个新文件。
    • index 0000000..e69de29:这是 Git 关于文件内容的内部信息。
    • --- /dev/null:表示提交前的状态(文件不存在)。
    • +++ b/message.txt:表示提交后的状态。
    • @@ -0,0 +1 @@:这是一个“块头”,用于指示更改。-0,0 表示在原始文件中从第 0 行开始没有删除任何行,+1 表示在新文件中从第 1 行开始添加了一行。
    • +Hello, Future Me:这是本次提交中添加的行。+ 号表示添加。

git show 命令对于理解项目历史非常有用。你可以使用它来确切地查看任何特定提交中所做的更改,这对于调试或理解某个功能的实现方式至关重要。

q 退出 git show 视图。

使用 git diff-tree 检查空提交

在这一步中,我们将探索另一个命令 git diff-tree,它对于检查提交中的更改非常有用,尤其适用于判断一个提交是否为“空”(即该提交未引入任何文件内容更改,仅修改了提交信息等元数据)。

首先,确保你位于项目目录中:

cd ~/project/my-time-machine

现在,让我们对第一次提交(HEAD)使用带有 --no-commit-id--name-only 选项的 git diff-tree 命令。

git diff-tree --no-commit-id --name-only HEAD

你应该会看到以下输出:

message.txt

下面来理解这个命令及其输出:

  • git diff-tree:该命令用于比较 Git 树中对象的内容和模式。
  • --no-commit-id:此选项会在输出中不显示提交 ID,使输出更简洁。
  • --name-only:该选项仅显示提交中发生更改的文件名称。
  • HEAD:指定我们要检查的提交(即最新提交)。

输出 message.txt 表明 HEAD 指向的提交对 message.txt 文件进行了更改。

现在,让我们看看如果对一个未更改任何文件的提交运行相同的命令会发生什么。由于我们目前只有第一次提交,让我们假设一种情况。如果有一个提交仅更新了提交信息而未更改任何文件,那么 git diff-tree --no-commit-id --name-only <commit-hash> 将不会产生任何输出。这就是你可以使用 git diff-tree 来检查一个提交在文件更改方面是否为“空”的方法。

虽然 git show 能让你详细查看更改内容,但带有 --name-only 等选项的 git diff-tree 对于编写脚本或快速检查哪些文件受到提交影响而无需查看完整的差异信息非常有用。

使用常规提交进行测试

在这一步中,你将练习创建更多提交,为仓库构建提交历史,并了解 git loggit status 如何反映这些更改。这将模拟一个更典型的工作流程,即你进行多次更改并逐步保存。

首先,确保你位于项目目录中:

cd ~/project/my-time-machine

现在,让我们在 message.txt 文件中再添加一行内容。你可以使用带有 >>echo 命令将文本追加到现有文件中。

echo "Adding another line for testing." >> message.txt

让我们检查文件内容,确认更改已生效:

cat message.txt

你应该会看到:

Hello, Future Me
Adding another line for testing.

现在,让我们检查仓库的状态:

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 commit -m "Add a second line to message.txt"

你应该会看到确认提交的输出:

[master a1b2c3d] Add a second line to message.txt
 1 file changed, 1 insertion(+)

现在,你已经创建了第二次提交。让我们使用 git log 查看提交历史:

git log

你现在应该会看到两条提交记录,最新的提交位于顶部:

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

    Add a second line to message.txt

commit f0e1d2c3b4a5968776543210fedcba9876543210
Author: Jane Doe <[email protected]>
Date:   Mon Aug 7 09:55:00 2023 +0000

    Send a message to the future

(注意:你输出中的提交哈希和日期会有所不同)

这展示了进行更改、使用 git add 暂存更改以及使用 git commit 将其保存为新提交的基本循环。每次提交都代表项目历史中的一个不同时间点,让你可以跟踪进度,并在需要时恢复到之前的状态。

q 退出日志查看。

总结

在本次实验中,你学习了如何使用 git show 命令检查 Git 提交的详细信息。该命令能全面展示特定提交的信息,包括其元数据(作者、日期、提交信息),以及以差异(diff)格式呈现的该提交所引入的具体更改。你看到了差异输出如何清晰地指示出新增、删除或修改的行,从而让你了解提交中的内容更改。

后续你将继续探索检查提交是否为空的方法,并使用不同类型的提交来测试这些技术。