历史记录与变更

GitBeginner
立即练习

简介

在之前的实验中,你学习了如何初始化一个「时间机器」(Git 仓库),并保存第一个快照。但项目并不是静态不变的——它会持续演进。你会修复错误、添加功能并更新文档。

Git 擅长跟踪这些变化。它可以帮助你:

  1. 检查变更:在保存之前,准确查看你修改了哪些行。
  2. 查看历史:回顾曾经保存的每个快照,了解谁在什么时候做了什么。

这就是版本控制的真正价值:它不仅用于备份,还能以结构化的方式保存项目随时间变化的历史。

在本实验中,你将修改一个文件,使用 git diff 检查精确差异,保存新的快照,然后使用 git log 浏览项目历史。这是实际 Git 工作流中经常使用的基本检查循环。

修改项目文件

我们从一个已经包含一次提交(「Initial commit」)的仓库开始。现在模拟在这个项目上进行一些工作。

进入项目目录:

cd /home/labex/project

查看 readme.txt 的当前内容:

cat readme.txt

你应该看到:Hello World

通过追加新行来修改文件。我们将添加一段简单的说明:

echo "Git is a version control system" >> readme.txt

确认文件已经发生变化:

cat readme.txt

输出:

Hello World
Git is a version control system

Git 已经发现 readme.txt 与上一个快照中保存的版本不同。现在,该文件被视为 Modified。

使用 Git Diff 检查变更

在保存工作之前,最好准确检查你修改的内容。这就像提交文章之前先校对一样。

Git 提供了 diff 命令来完成这项工作。它会比较工作目录中的文件与上一次提交(快照)中的文件。

因此,git diff 比较的是两个状态:历史中已保存的内容,以及当前工作树中存在的内容。它是永久记录变更之前检查工作的主要工具之一。

运行 git diff 查看变更:

git diff

分析输出:

diff --git a/readme.txt b/readme.txt
index ...
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1,2 @@
 Hello World
+Git is a version control system
  • --- a/readme.txt:原始版本(旧版本)。
  • +++ b/readme.txt:当前版本(新版本)。
  • +Git is...:加号(+)表示新增了一行。(减号 - 表示删除了一行。)

阅读 diff 输出是 Git 的核心技能,因为它可以显示逐行变更。之后的许多工作流,例如代码审查、应用补丁和拉取请求,都建立在相同的理念之上。

这一步可以确认你的变更正是你想要的内容。

使用 Git Commit 保存变更

确认变更无误后,现在保存一个新的快照。记住这两个步骤:暂存(Stage),也就是把文件放到装货区;以及提交(Commit),也就是创建快照。

先检查状态:

git status

你会在「Changes not staged for commit」下方看到红色的 readme.txt。

暂存该文件:

git add readme.txt

再次检查状态:

git status

现在,readme.txt 会显示为绿色,并位于「Changes to be committed」下方。

这再次体现了 Git 对「已修改内容」和「已暂存内容」的区分。文件中可以存在变更,但在暂存之前,这些变更不会成为下一次提交的候选内容。

使用清晰的消息提交快照:

git commit -m "Add description about Git"
  • -m:允许你直接输入提交消息。
  • 提交消息应说明你修改了什么。

现在,你已经保存了项目历史的第二个版本!

查看项目历史

现在,你的仓库中有两次提交。要查看项目的时间线,请使用 git log 命令。这就是你的「历史记录簿」。

查看完整日志:

git log

检查输出:

commit 8d3a1b2... (SHA Hash)
Author: Your Name <you@example.com>
Date:   Mon Oct 10 10:00:00 2023 +0000

    Add description about Git

commit 4f2b3c4... (SHA Hash)
Author: Your Name <you@example.com>
Date:   Mon Oct 10 09:00:00 2023 +0000

    Initial commit
  • SHA Hash:较长的 ID 字符串(例如 8d3a...)。它是特定快照的唯一指纹。
  • HEAD:(如果显示)指向你当前位置的指针。
  • 顺序:最新的提交始终位于顶部。

这些哈希值是 Git 识别历史的核心。Git 不使用连续数字为提交命名,而是使用基于内容的标识符,让每个快照都有唯一的引用。

(如果需要,按 q 退出日志查看界面。)

查看精简历史

随着项目持续开发数月,完整的 git log 可能会变得过长且包含过多细节。有时,你只需要一个快速的摘要列表。

Git 提供了 --oneline 标志来完成这项工作。

运行精简日志命令:

git log --oneline

检查输出:

8d3a1b2 Add description about Git
4f2b3c4 Initial commit

这种视图只显示每次提交的短哈希和提交消息,每行一条。它非常适合快速浏览最近发生了什么。

挑战:

再次修改 readme.txt(添加另一行),提交这次变更,然后再次检查 git log --oneline。你应该会看到三条记录!

总结

在本实验中,你学习了如何管理项目变更的完整生命周期:

  1. 修改:修改文件内容。
  2. 检查:使用 git diff 验证这些变更。
  3. 提交:使用 git add 和 git commit 保存永久快照。
  4. 查看:使用 git log 和 git log --oneline 浏览时间线。

这四个命令是日常使用 Git 的核心。掌握它们,就掌握了版本控制的基础。