标签:
也就是说,只要拥有一个commit对象,就可以完整地还原当时的版本,不需要额外的东西了。这一个事实也是理解后面很多东西的基础。
这个概念类似于fp里的不可变数据,就是说,commit对象的属性,譬如说它的父commit是谁,它指向哪个tree对象,它的提交时间,等等,这些信息,在初始化以后,都是不可变的。
当使用reset, rebase, cherry-pick这些命令来“改变历史”的时候,并没有修改已有的commit对象,而是创建了一些新的commit,并且把分支游标指向了它们。
在Revision Graph里面,通过一条有向边“ 父commit <= 子commit"来建立这种关系。常见的,进行3方merge的时候,一个commit对象就会有2个父commit对象。
你可以随意新建commit对象,并且在初始化的时候,随意给它指定一些现成的commit对象作为父commit对象。也就是说,两个commit对象即使是父子关系,它们对应的文件快照之间也是没有约束!
造成这个的原因就是前面提到的:commit对象记住的是当时完整的文件快照
标签:
原文地址:http://my.oschina.net/mustang/blog/363618