Git 入门指南
本章将涵盖以下主题:
- Git 对象
- 三个阶段
- 有向无环图(DAG)的查看
- 提炼已修复事项
- 获取变更文件的列表
- 使用 gitk 查看提交历史
- 在历史记录中查找提交版本
- 在历史代码中检索信息
1.1 引言
在本章中,我们将深入探讨 Git 的数据模型。我们将学习 Git 如何引用其对象,以及历史记录是如何被记录的。我们将掌握历史记录中的导航方法——从在提交信息中查找特定文本片段,到追溯某个字符串在代码中的首次出现。
Git 的数据模型在处理数据的方式上与其他常见的 版本控制系统(VCS) 不同。传统上,VCS 会将数据存储为初始文件,随后为该文件的每个新版本添加补丁列表:
Git 则不同:它不记录常规的文件和补丁列表,而是记录所有被 Git 跟踪的文件及其相对路径(相对于仓库根目录)——即文件系统树中被 Git 跟踪的文件。 Git 中的每次提交都记录着完整的树形结构的状态。若文件在两次提交间未发生变更,Git 不会重复存储该文件,而是存储指向该文件的 链接(link)。下图展示了每次提交(或版本)更新后文件的存储方式:
这正是 Git 区别于大多数其他版本控制系统的关键所在;后续章节我们将深入探讨这类强大的模型所带来的诸多优势。
Git 将文件和目录的引用方式直接构建到了它的数据模型中。简而言之,Git 的数据模型可概括为如下图所示:
其中,commit 对象指向 顶级树(root tree);顶级树指向子树和文件。
分支(branch)和标签(tag)则指向某个 commit 对象;而 HEAD 对象指向当前检出的 分支。因此,对于每次提交,完整的树状态和快照都由顶级树标识。
1.2 Git 对象
既然你已经知道 Git 会将每次提交都存储为完整的树状态或快照,下面就来仔细看看对象在 Git 仓库中的存储方式。


