如何检查 Git 提交是否已被撤销

GitGitBeginner
立即练习

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

简介

在本次实验中,你将学习如何识别一个 Git 提交是否已被撤销。我们将探讨如何使用 git log 命令来查找撤销提交,然后利用 git show 来验证这些撤销操作的详细信息。最后,我们将检查未被撤销的提交,以了解它们在历史记录和内容上的差异。这个实践练习将指导你创建一个示例项目历史,其中包括一个随后被撤销的提交,让你能够练习识别和验证撤销提交的技巧。


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/commit("Create Commit") git/BasicOperationsGroup -.-> git/diff("Compare Changes") git/BranchManagementGroup -.-> git/log("Show Commits") subgraph Lab Skills git/add -.-> lab-560064{{"如何检查 Git 提交是否已被撤销"}} git/commit -.-> lab-560064{{"如何检查 Git 提交是否已被撤销"}} git/diff -.-> lab-560064{{"如何检查 Git 提交是否已被撤销"}} git/log -.-> lab-560064{{"如何检查 Git 提交是否已被撤销"}} end

运行 git log 查找撤销提交

在这一步中,你将学习如何使用 git log 来查找已被撤销的提交。撤销一个提交意味着创建一个新的提交,以撤销前一个提交所引入的更改。当你犯了错误,并且希望在不丢失原始提交历史的情况下轻松撤销更改时,这种方法非常有用。

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

cd ~/project/my-time-machine

现在,让我们创建几个提交来模拟项目历史,其中包括一个稍后会被撤销的提交。

创建第一个文件:

echo "Initial content" > file1.txt
git add file1.txt
git commit -m "Add file1"

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

[master (root-commit) a1b2c3d] Add file1
 1 file changed, 1 insertion(+)
 create mode 100644 file1.txt

现在,添加更多内容并进行另一次提交:

echo "Adding more content" >> file1.txt
git add file1.txt
git commit -m "Add more content to file1"

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

[master 4e5f6g7] Add more content to file1
 1 file changed, 1 insertion(+)

接下来,创建一个稍后会被撤销的提交:

echo "This commit will be reverted" > file2.txt
git add file2.txt
git commit -m "Add file2 (will be reverted)"

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

[master 8h9i0j1] Add file2 (will be reverted)
 1 file changed, 1 insertion(+)
 create mode 100644 file2.txt

现在,撤销最后一次提交。你可以使用 git revert HEAD 来撤销最近的提交:

git revert HEAD --no-edit

--no-edit 标志告诉 Git 自动创建撤销提交的消息,而无需打开编辑器。你应该会看到类似以下的输出:

[master k2l3m4n] Revert "Add file2 (will be reverted)"
 1 file changed, 1 deletion(-)
 delete mode 100644 file2.txt

很棒!你现在已经创建了一个撤销“Add file2 (will be reverted)”提交更改的提交。

现在,使用 git log 查看提交历史并查找撤销提交:

git log --oneline

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

k2l3m4n (HEAD -> master) Revert "Add file2 (will be reverted)"
8h9i0j1 Add file2 (will be reverted)
4e5f6g7 Add more content to file1
a1b2c3d Add file1

注意提交消息“Revert 'Add file2 (will be reverted)'”。这清楚地表明这个提交是对前一个提交的撤销。使用带有 --oneline 标志的 git log 是快速查看提交历史摘要并通过提交消息识别撤销提交的方法。

使用 git show 验证撤销操作

在这一步中,你将使用 git show 命令来检查撤销提交的详细信息,并验证它是否正确地撤销了原始提交所做的更改。git show 命令是一个强大的工具,可用于检查 Git 对象,包括提交、标签和数据块。

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

cd ~/project/my-time-machine

现在,你需要撤销提交的哈希值。你可以从上一步的 git log --oneline 输出中获取该值,它是列表中的第一个提交。例如,如果你的 git log --oneline 输出如下:

k2l3m4n (HEAD -> master) Revert "Add file2 (will be reverted)"
8h9i0j1 Add file2 (will be reverted)
4e5f6g7 Add more content to file1
a1b2c3d Add file1

撤销提交的哈希值是 k2l3m4n注意:你的提交哈希值会有所不同。

现在,使用 git show 命令,后面跟上你的撤销提交的哈希值。将 YOUR_REVERT_COMMIT_HASH 替换为你 git log --oneline 输出中的实际哈希值:

git show YOUR_REVERT_COMMIT_HASH

例如,使用示例哈希值 k2l3m4n

git show k2l3m4n

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

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

    Revert "Add file2 (will be reverted)"

    This reverts commit 8h9i0j1.

diff --git a/file2.txt b/file2.txt
deleted file mode 100644
index 8b1a99c..0000000
--- a/file2.txt
+++ /dev/null
@@ -1 +0,0 @@
-This commit will be reverted

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

  • 第一部分显示了提交的详细信息:提交哈希值、作者、日期和提交消息。注意,消息明确指出它撤销了一个特定的提交(通过其哈希值标识)。
  • diff 部分显示了该提交所引入的更改。在这种情况下,它显示 file2.txt 已被删除(deleted file mode 100644)。这证实了撤销提交成功地撤销了 file2.txt 的创建操作。

使用 git show 可以让你检查历史记录中任何提交所引入的具体更改。这对于理解项目的历史以及验证撤销操作或其他更改是否正确应用非常有用。

测试未撤销的提交

在前面的步骤中,你创建了几个提交,然后撤销了其中一个。你使用 git log 查看了提交历史,并使用 git show 检查了撤销提交。现在,让我们验证那些 未被撤销 的提交仍然存在,并且包含预期的更改。

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

cd ~/project/my-time-machine

回顾一下 git log --oneline 输出的提交历史:

k2l3m4n (HEAD -> master) Revert "Add file2 (will be reverted)"
8h9i0j1 Add file2 (will be reverted)
4e5f6g7 Add more content to file1
a1b2c3d Add file1

“Add file1”和“Add more content to file1”这两个提交未被撤销。让我们使用 git show 来检查“Add more content to file1”提交,并查看其更改。

从你的 git log --oneline 输出中找到“Add more content to file1”提交的哈希值。在上面的示例中,它是 4e5f6g7请记得使用你实际的提交哈希值。

现在,使用该提交哈希值运行 git show 命令:

git show YOUR_MORE_CONTENT_COMMIT_HASH

例如,使用示例哈希值 4e5f6g7

git show 4e5f6g7

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

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

    Add more content to file1

diff --git a/file1.txt b/file1.txt
index 8b1a99c..a1b2c3d 100644
--- a/file1.txt
+++ b/file1.txt
@@ -1 +1,2 @@
 Initial content
+Adding more content

这个输出显示了提交的详细信息,diff 部分清楚地表明在 file1.txt 中添加了一行“Adding more content”。这证实了这个提交及其更改仍然是项目历史的一部分,即使后续有一个提交被撤销了。

这展示了 Git 的一个关键特性:撤销一个提交会创建一个 新的 提交来撤销更改,但不会从历史记录中删除原始提交。这一点很重要,因为它保留了所有更改的完整记录,让你能够了解项目的完整演变过程。

你可以类似地使用 git show 命令和“Add file1”提交的哈希值(在示例中是 a1b2c3d)来查看 file1.txt 的初始创建情况。

通过使用 git log 查看历史记录和使用 git show 检查单个提交,即使在有提交被撤销的情况下,你也能有效地浏览和理解项目的时间线。

总结

在本次实验中,你学习了如何在 Git 仓库中识别被撤销的提交。首先,你创建了包含多个提交的项目历史,其中包括一个专门用于撤销的提交。然后,你使用 git revert HEAD --no-edit 命令创建了一个新的提交,该提交撤销了前一个提交所做的更改。这个过程展示了撤销提交是如何在历史记录中添加一个新提交,而不是删除原始提交的。

你还学习了如何使用 git log 查找这些撤销提交,并使用 git show 验证它们的内容,从而将它们与未被撤销的提交区分开来。