提交对象

commit 可能是 git 用户最熟悉的 object 类型,因为它是用于使用 git commit 命令创建的。

但是,commit 不直接包含任何已更改的文件或数据。相反,它主要包含元数据和指向其他 objects 的指针,其中包含 commit 的实际内容。

一个 commit 包含一些东西:

  • tihuan 的哈希
  • 父母 commit 的哈希
  • 作者姓名/电子邮件,委员姓名/电子邮件
  • 提交消息

你可以看到任何提交的内容,如下所示:

$ git cat-file commit 5bac93
tree 04d1daef...
parent b7850ef5...
author Geddy Lee <glee@rush.com>
commiter Neil Peart <npeart@rush.com>

First commit!

一个非常重要的注意事项是 tree 对象存储项目中的每个文件,并且它存储的所有文件都不是差异。这意味着每个 commit 都包含整个项目*的快照。

* 从技术上讲,只存储已更改的文件。但这更像是效率的实施细节。从设计角度来看,commit 应被视为包含项目的完整副本

parent 行包含另一个 commit 对象的散列,可以被认为是指向先前提交父指针。这隐式地形成了一个称为提交图提交图。具体来说,它是一个有向无环图 (或 DAG)。