4.2 对象库图示
让我们看看Git的对象之间是如何协作来形成完整系统的。
blob对象是数据结构的“底端”;它什么也不引用而且只被树对象引用。在接下来的图里,每个blob由一个矩形表示。
树对象指向若干blob对象,也可能指向其他树对象。许多不同的提交对象可能指向任何给定的树对象。每个树对象由一个三角形表示。
一个圆圈表示一个提交对象。一个提交对象指向一个特定的树对象,并且这个树对象是由提交对象引入版本库的。
每个标签由一个平行四边形表示。每个标签可以指向最多一个提交对象。
分支不是一个基本的Git对象,但是它在命名提交对象的时候起到了至关重要的作用。把每个分支画成一个圆角矩形。
图4-1展示了所有部分如何协作。这张图显示了一个版本库在添加了两个文件的初始提交后的状态。两个文件都在顶级目录中。同时它们的master分支和一个叫V1.0的标签都指向ID为1492的提交对象。
现在,让我们使事情变得复杂一点。保留原来的两个文件不变,添加一个包含一个文件的新子目录。对象库就如图4-2所示。
就像前一张图里,新提交对象添加了一个关联的树对象来表示目录和文件结构的总状态。在这里,它是ID为cafed00d的树对象。
因为顶级目录被添加的新子目录改变了,顶级树对象的内容也跟着改变了,所以Git引进了一个新的树对象:cafed00d。
然而,blob对象dead23和feeb1e在从第一次到第二次提交的时候没有发生变化。Git意识到ID没有变化,所以可以被新的cafed00d树对象直接引用和共享。
请注意提交对象之间箭头的方向。父提交在时间上来得更早。因此,在Git的实现里,每个提交对象指回它的一个或多个父提交。很多人对此感到困惑,因为版本库的状态通常画成反方向:数据流从父提交流向子提交。
第6章扩展了这些图来展示版本库的历史是如何建立和被不同命令操作的。