object是Git版本一个重要的概念,此文记录了各类型object的联系及object对象的一些特点,部分内容参考自《Git权威指南》
理解commit对象
一个提交一般包含了三个对象ID,分别为当前提交对象、当前目录树对象及父提交对象,以下为objects对象库内提交对象跟踪链示意图
理解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
:源提交的第二个父提交,在合并分支时会出现该类提交