如何检查 Git 提交是否被修改

GitGitBeginner
立即练习

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

简介

在这个实验中,你将学习如何判断一个 Git 提交是否被修改过。我们将探索 git reflog 命令,以查看引用更新的历史记录,这可以揭示修改操作。

你还将学习如何使用 git log 来比较提交,并理解修改过的提交和未修改过的提交之间的差异,从而获得检查仓库历史记录的实用技能。


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/BranchManagementGroup -.-> git/log("Show Commits") git/BranchManagementGroup -.-> git/reflog("Log Ref Changes") subgraph Lab Skills git/add -.-> lab-560069{{"如何检查 Git 提交是否被修改"}} git/status -.-> lab-560069{{"如何检查 Git 提交是否被修改"}} git/commit -.-> lab-560069{{"如何检查 Git 提交是否被修改"}} git/log -.-> lab-560069{{"如何检查 Git 提交是否被修改"}} git/reflog -.-> lab-560069{{"如何检查 Git 提交是否被修改"}} end

检查 git reflog 中的修改记录

在这一步中,我们将探索 git reflog 命令,以及它如何帮助我们查看仓库的历史记录,包括修改提交等操作。

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

cd ~/project/my-time-machine

现在,让我们使用 git reflog 命令来查看仓库的历史记录。reflog(引用日志)记录了对分支尖端和仓库中其他引用的更新。这与 git log 不同,后者显示的是提交历史。

输入以下命令:

git reflog

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

a1b2c3d (HEAD -> master) HEAD@{0}: commit: Send a message to the future
a1b2c3d (HEAD -> master) HEAD@{1}: initial commit (amend): Send a message to the future
e4f5g6h HEAD@{2}: commit (initial): Send a message to the future

让我们来分析一下这个输出:

  • 每一行代表一次更新引用(如 HEAD)的操作。
  • HEAD@{0} 是最近的操作,HEAD@{1} 是之前的操作,依此类推。
  • 每行的第一部分(a1b2c3de4f5g6h)是提交哈希。注意在“amend”操作后提交哈希是如何变化的。
  • 提交哈希后面的文本描述了操作,如 commitinitial commit (amend)commit (initial)

git reflog 是一个强大的工具,可用于恢复丢失的提交,或了解导致仓库当前状态的操作顺序。它会显示你的 HEAD 曾经指向过的位置,即使这些提交不再是分支历史的一部分(例如,在进行修改或变基操作之后)。

在示例输出中,你可以看到类似 initial commit (amend) 的记录。这表明初始提交被修改过了。修改提交会用一个包含你已暂存更改的新提交替换最后一次提交。虽然 git log 只会显示最终的、修改后的提交,但 git reflog 会同时显示原始的初始提交和修改后的提交。

理解 git reflog 对于浏览项目历史至关重要,尤其是在你使用像 git commit --amend 这样会重写历史的命令时。

使用 git log 比较提交

在这一步中,我们将使用 git log 命令来查看提交历史,并了解它与 git reflog 的区别,特别是在使用 git commit --amend 之后。

确保你仍然位于 ~/project/my-time-machine 目录中。

现在,让我们使用 git log 查看提交历史:

git log --oneline

--oneline 选项提供了提交历史的简洁视图,将每个提交显示在一行上。

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

a1b2c3d (HEAD -> master) Send a message to the future

将此输出与上一步中 git reflog 的输出进行比较。注意,git log 只显示一个提交,即最终的、修改后的提交。它不会显示被修改操作替换的原始初始提交。

这是 git loggit reflog 之间的一个关键区别。git log 显示从当前分支尖端可到达的提交历史,而 git reflog 显示 HEAD 和其他引用所指向位置的历史。

可以将 git log 视为你项目的官方发布历史,而 git reflog 则是你在仓库中所做一切的个人记录。

你还可以使用 git log 来比较不同的提交。虽然目前我们的历史记录中只有一个提交,但在一个有多个提交的实际项目中,你可以使用 git log commit1..commit2 这样的命令来查看历史中两个特定点之间的提交,或者使用 git diff commit1 commit2 来查看两个提交之间引入的具体更改。

目前,重要的是要理解 git log 显示提交历史,而 git reflog 显示引用更新的历史。

测试未修改的提交

在这一步中,我们将创建一个不使用 --amend 标志的新提交,并观察它在 git loggit reflog 中的显示情况。这将有助于你巩固对这两个命令如何以不同方式跟踪历史记录的理解。

首先,让我们向 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 add message.txt

现在,让我们创建一个新提交,而不修改前一个提交:

git commit -m "Add another message"

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

[master 1a2b3c4] Add another message
 1 file changed, 1 insertion(+)

现在,让我们再次检查 git log

git log --oneline

这次,你应该会看到两个提交:

1a2b3c4 (HEAD -> master) Add another message
a1b2c3d Send a message to the future

这两个提交在 git log 中都可见,因为第二个提交是在第一个提交的基础上添加的,扩展了分支的历史记录。

最后,让我们检查 git reflog

git reflog

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

1a2b3c4 (HEAD -> master) HEAD@{0}: commit: Add another message
1a2b3c4 (HEAD -> master) HEAD@{1}: commit (amend): Send a message to the future
e4f5g6h HEAD@{2}: commit (initial): Send a message to the future

注意,git reflog 显示了所有操作:初始提交、修改后的初始提交以及我们刚刚创建的新提交。每次移动 HEAD 的操作都会被记录下来。

这一步表明,当你不使用 --amend 创建新提交时,git loggit reflog 都会显示新提交,但 git reflog 仍会保留修改提交的历史记录,而 git log 则不会。

总结

在本次实验中,我们学习了如何检查 Git 提交是否被修改。我们探索了 git reflog 命令,它提供了像 HEAD 这样的引用的更新历史,使我们能够查看诸如修改提交之类的操作。通过检查 reflog 输出,我们可以识别出表明修改操作的条目,并观察到此类操作后提交哈希的变化。

我们还了解到,git reflog 是理解仓库中操作顺序的宝贵工具,即使对于那些无法再通过 git log 直接访问的提交也是如此。这有助于恢复丢失的工作或诊断仓库历史记录中的问题。