object是Git版本一个重要的概念,此文记录了各类型object的联系及object对象的一些特点,部分内容参考自《Git权威指南》

理解commit对象

一个提交一般包含了三个对象ID,分别为当前提交对象、当前目录树对象及父提交对象,以下为objects对象库内提交对象跟踪链示意图

git-objects-show-1

理解HEAD及分支引用

HEAD为一个引用,指向一个分支,内容为该分支的位置,如下所示:

$ cat HEAD
ref: refs/heads/master

其中refs为引用命名空间,找到master文件并输出,可以看到refs/heads/master引用指向的是一个提交对象的id

$ git rev-parse refs/heads/master
8002d16a7268c794afa318f82da4df32891f092f
$ git cat-file -t refs/heads/master
commit

理解object对象id

git对象id由一个hash值,由对象的内容生成,使用的是sha1数据摘要算法,由于git是分布式版本库,故当多人协作时,为了避免冲突,必须保证各对象id间不冲突,因此需要一个全球唯一的id(还是有概率冲突╮(╯▽╰)╭,但概率极小,可忽略不计,具体原因可自行查找),sha1数据摘要算法正满足了这种要求。需要注意的是,对象id为40位的16进制数组成,打开.git/objects文件夹可以看到该id的前两位为对象的存储目录名称,后38位为对应文件的名称。

快速指定commit对象

在git命令中指定某次提交即指向该commit对象的Id,以下为快速指定提交对象的一些方法

由上可知HEAD一般指向当前分支的最近一次提交,以下的源提交以HEAD为例,也可用某次提交的id或缩略id替代(缩略id必须大于4位,一般指定7位id,不与其他id冲突即可)

  • HEAD^:源提交的父提交
  • HEAD^^:源提交的父提交的父提交,以此类推
  • HEAD~1:源提价的父提交
  • HEAD~n:源提交的n代祖先提交,以此类推
  • HEAD^1:源提交的第一个父提交,在合并分支时会出现该类提交
  • HEAD^2:源提交的第二个父提交,在合并分支时会出现该类提交