简介
在这个实验中,你将学习如何判断一个 Git 提交是否被修改过。我们将探索 git reflog
命令,以查看引用更新的历史记录,这可以揭示修改操作。
你还将学习如何使用 git log
来比较提交,并理解修改过的提交和未修改过的提交之间的差异,从而获得检查仓库历史记录的实用技能。
在这个实验中,你将学习如何判断一个 Git 提交是否被修改过。我们将探索 git reflog
命令,以查看引用更新的历史记录,这可以揭示修改操作。
你还将学习如何使用 git log
来比较提交,并理解修改过的提交和未修改过的提交之间的差异,从而获得检查仓库历史记录的实用技能。
在这一步中,我们将探索 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}
是之前的操作,依此类推。a1b2c3d
、e4f5g6h
)是提交哈希。注意在“amend”操作后提交哈希是如何变化的。commit
、initial commit (amend)
或 commit (initial)
。git reflog
是一个强大的工具,可用于恢复丢失的提交,或了解导致仓库当前状态的操作顺序。它会显示你的 HEAD
曾经指向过的位置,即使这些提交不再是分支历史的一部分(例如,在进行修改或变基操作之后)。
在示例输出中,你可以看到类似 initial commit (amend)
的记录。这表明初始提交被修改过了。修改提交会用一个包含你已暂存更改的新提交替换最后一次提交。虽然 git log
只会显示最终的、修改后的提交,但 git reflog
会同时显示原始的初始提交和修改后的提交。
理解 git reflog
对于浏览项目历史至关重要,尤其是在你使用像 git commit --amend
这样会重写历史的命令时。
在这一步中,我们将使用 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 log
和 git 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 log
和 git 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 log
和 git reflog
都会显示新提交,但 git reflog
仍会保留修改提交的历史记录,而 git log
则不会。
在本次实验中,我们学习了如何检查 Git 提交是否被修改。我们探索了 git reflog
命令,它提供了像 HEAD
这样的引用的更新历史,使我们能够查看诸如修改提交之类的操作。通过检查 reflog
输出,我们可以识别出表明修改操作的条目,并观察到此类操作后提交哈希的变化。
我们还了解到,git reflog
是理解仓库中操作顺序的宝贵工具,即使对于那些无法再通过 git log
直接访问的提交也是如此。这有助于恢复丢失的工作或诊断仓库历史记录中的问题。