提交对象
运行了git commit
命令之后,Git仓库里会创建一个新的提交对象,这个提交对象至少包括这些东西:
- 提交时表示暂存区状态的树对象的哈希值,也就是下面图3的哈希值 39179a1。
- 提交者,包括名字、邮箱地址和日期。
- 提交说明
提交对象也有哈希值
因为提交对象是对象数据库的一部分,它们不仅有哈希值,也被一个哈希值所引用。
提交对象举例
前面聊过了树对象,所谓提交对象也无非是提供一个指向 树对象的指针再加上一些类似于时间、人物、动机的 metadata。
这张图是没有提交对象的树对象。
这张图有提交对象。可以看到,提交对象包括一个指向树对象顶层哈希值的 tree 属性和一些 metadata。而 HEAD 指针又指向当前分支的最新提交。
父提交对象
一个提交对象可能还有父提交:
- 第一次向一个仓库提交代码,该提交对象没有父提交。
- 如果一个提交对象有两个以上的父提交,说明发生了合并。
提交的作者
一个提交的作者(author)和提交者(committer)是不一样的。作者是指写这份代码的人,而提交者可能是管理仓库的人。
添加一个文件并提交
这里添加了一个文件夹 test,下面有一个文件 plan。在运行git commit
之后,会生成一个新的提交对象,这个对象指向一个新生成的树对象,这个树对象包含了所有的文件。与此同时,HEAD 的指向也发生了变化,指向了新的提交对象。
总结
Git 对暂存区的文件夹和文件有完整的记录,并且把这些数据作为提交的一部分。对于新提交而言,Git 会创建一个新的 树对象,这个树对象指向已经存在的和新添加的数据对象和树对象。