几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。 在很多版本控制系统中,这是一个略微低效的过程——常常需要完全创建一个源代码目录的副本。对于大项目来说,这样的过程会耗费很多时间。
有人把 Git 的分支模型称为它的“必杀技特性”,也正因为这一特性,使得 Git 从众多版本控制系统中脱颖而出。 为何 Git 的分支模型如此出众呢? Git 处理分支的方式可谓是难以置信的轻量,创建新分支这一操作几乎能在瞬间完成,并且在不同分支之间的切换操作也是一样便捷。 与许多其它版本控制系统不同,Git 鼓励在工作流程中频繁地使用分支与合并,哪怕一天之内进行许多次。 理解和精通这一特性,你便会意识到 Git 是如此的强大而又独特,并且从此真正改变你的开发方式。
git中存储的不是每个文件的变化或者差异,而是每次提交的快照.来分析一下:
在进行commit时,git会保存一个提交对象(commit object),那么很明显的就知道,本次保存的对象是一个指向暂存内容快照的指针.但不仅仅是这样,还包含了作者的姓名信息,还有commit时的一些信息,还有就是指向其父对象的指针
为了更加形象的说明,假设现在在工作区中,有三个将要被暂存和提交的文件.暂存操作会为每一个文件计算校验和,然后会把当前版本的文件快照存储到git仓库中,git将使用blob对象来保存,最终将校验和加入暂存区域commit.
当使用git commit时,git会先计算每一个子目录的校验和,然后git仓库中这些校验和保存为树对象.随后git会创建一个提交对象,它包含了上面提高的信息外,还包含了指向这个树对象的指针.
所以,git中现在包含了五个对象,三个blob对象(包含三个文件的校验和,其实就是快照) + 一个 树对象(记录目录结构和blob对象索引) + 一个提交对象.
git分支,其实本质上仅仅是指向提交对象的可变指针.git之中默认分支的名字是master.在多次提交操作之后,其实已经有一个指向最后那个提交对象的master分支,master分支会在每次提交时向前移动.git分支是如何创建的呢,很简单,其实只是创建了一个可以移动的新的指针.