引言
Git 是一个强大的版本控制系统,可以帮助开发者跟踪变更、协作并有效地管理其代码库。Git 的一项基本技能是能够检查项目的历史记录,了解哪些变更是在何时、由谁进行的。在本实验中,你将学习如何查看特定 Git commit 中引入的变更。这对于理解项目的演进、审查代码和解决问题至关重要。
Git 是一个强大的版本控制系统,可以帮助开发者跟踪变更、协作并有效地管理其代码库。Git 的一项基本技能是能够检查项目的历史记录,了解哪些变更是在何时、由谁进行的。在本实验中,你将学习如何查看特定 Git commit 中引入的变更。这对于理解项目的演进、审查代码和解决问题至关重要。
在你能够查看特定 commit 的变更之前,你首先需要找到那个 commit。git log 命令用于显示仓库的 commit 历史。在本实验中,一个示例 Git 仓库已为你创建在 ~/project/git-demo。
首先,导航到项目目录。本实验中的所有命令都应在此目录内运行。
cd ~/project/git-demo
现在,使用带有 --oneline 选项的 git log 命令来查看 commit 历史的紧凑视图。这将向你展示所有 commit 的列表,每个 commit 都带有其唯一的 commit hash 和 commit message。
git log --oneline
你应该会看到类似以下的输出。你屏幕上的 commit hash 会有所不同,但 commit message 会是相同的。
a1b2c3d (HEAD -> master) Add application file
e4f5g6h Update README with project description
i7j8k9l Initial commit: Add README.md
每一行代表一个 commit。每行开头的 7 位字符串(例如 a1b2c3d)是 commit hash 的缩短版本,它唯一标识了该 commit。你将在下一步中使用这些 hash 来检查特定的 commit。
现在你已经有了 commit 列表,你可以使用 git show 命令来查看特定 commit 的详细信息和变更。这个命令会显示 commit 的元数据(作者、日期、消息)以及“diff”,它会高亮显示被添加或删除的确切行。
让我们来检查第二个 commit,它的消息是“Update README with project description”。从上一步的输出中找到它的 commit hash。
复制 hash 并与 git show 一起使用。将 <commit-hash> 替换为你终端中的实际 hash。
git show <commit-hash>
例如,如果那个 commit 的 hash 是 e4f5g6h,你将运行:
git show e4f5g6h
输出会类似这样:
commit e4f5g6h1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7
Author: LabEx <labex@example.com>
Date: ...
Update README with project description
diff --git a/README.md b/README.md
index ...
--- a/README.md
+++ b/README.md
@@ -1 +1,3 @@
## My Project
+
+This is a simple project to demonstrate Git.
让我们来分解一下输出:
diff --git 开头的部分是“diff”。
--- a/README.md 和 +++ b/README.md 指示了文件的“之前”和“之后”版本。+ 开头的行是在此 commit 中添加的行。- 开头的行(此示例中不存在)是被删除的行。有时,一个 commit 可能会更改多个文件,但你只对某个特定文件的变更感兴趣。你可以通过在命令末尾添加文件路径来告诉 git show 只显示特定文件的变更。
让我们看看最新的 commit,它的消息是“Add application file”。这个 commit 添加了 app.py 文件。
首先,从你的 git log --oneline 输出中获取最新 commit 的 hash。然后,运行 git show,后面跟上该 hash,然后是 -- 和文件名 app.py。
git show app.py < latest-commit-hash > --
例如,如果最新的 commit hash 是 a1b2c3d,命令将是:
git show a1b2c3d -- app.py
输出现在将仅限于该 commit 中对 app.py 所做的更改。
commit a1b2c3d...
Author: LabEx <labex@example.com>
Date: ...
Add application file
diff --git a/app.py b/app.py
new file mode 100644
index 0000000..d95f32b
--- /dev/null
+++ b/app.py
@@ -0,0 +1 @@
+print("Hello, Git!")
请注意,输出要短得多,并且只包含 app.py 的 diff。new file mode 100644 这行表示该文件在此 commit 中被创建。
虽然 git show 用于查看单个 commit 中的变更,但你可以使用 git diff 来查看任意两个 commit 之间的累积变更。这对于查看两个时间点之间发生的所有变更非常有用,例如两个发布版本之间。
让我们比较初始 commit 和最新 commit,以查看到目前为止项目中发生的所有更改。你需要第一个 commit(“Initial commit: Add README.md”)和最后一个 commit(“Add application file”)的 commit hashes。
使用带有两个 hashes 的 git diff 命令。
git diff <first-commit-hash> <last-commit-hash>
例如,如果你的第一个 commit hash 是 i7j8k9l,最后一个是 a1b2c3d:
git diff i7j8k9l a1b2c3d
输出将显示这两个 commit 之间发生的所有更改的合并 diff。
diff --git a/README.md b/README.md
index ...
--- a/README.md
+++ b/README.md
@@ -1 +1,3 @@
## My Project
+
+This is a simple project to demonstrate Git.
diff --git a/app.py b/app.py
new file mode 100644
index 0000000..d95f32b
--- /dev/null
+++ b/app.py
@@ -0,0 +1 @@
+print("Hello, Git!")
此输出同时显示了对 README.md 的更新和 app.py 的创建,让你对项目在这两个时间点之间的演变有了完整的了解。
在本实验中,你学习了如何导航 Git 仓库的历史并检查变更。你练习了使用 git log 列出 commit,使用 git show 查看单个 commit 的详细信息和变更(包括整个 commit 和特定文件),以及使用 git diff 比较两个 commit 之间的差异。这些命令是理解代码变更、调试以及在任何基于 Git 的项目中有效协作的基础。