git的分支的本质是啥呢? 就是在当前的最后一次的提交记录上,创建一个新的指针,将指针指向最后一次的提交记录的校验和.
好像是有点抽象,画一下.
head_1.jpg
head_2.jpg
那么,问题来了,假如现在在master分支上,重新搞了一个分支,dev_test.可以知道dev_test分支指向的是基于master分支最后一次commit记录的指针.因为两个分支所指向的全是最后一次提交commit记录的指针,那么git如何知道你本地当前是在哪个分支上呢?
git中有一个名为 HEAD 的特殊指针。 请注意它和许多其它版本控制系统(如 Subversion 或 CVS)里的 HEAD 概念完全不同。 在 Git 中,它是一个指针,指向当前所在的本地分支(译注:将 HEAD 想象为当前分支的别名)。
head_3.jpg
head_4.jpg
这样的设计,会带来啥好处呢?
head_6.jpg
未命名 2.jpg
在checkOut时,一个是将head命令重新指回master分支,另外一个是将当前的工作区切换成master分支指向的快照内容.
由于git的分支切换,仅仅是指向所指对象校验和的文件,所以创建和销毁都十分高效.创建一个新的分支即就是往一个文件中写入 41 个字节(40 个字符和 1 个换行符),如此的简单能不快吗?
这与过去大多数版本控制系统形成了鲜明的对比,它们在创建分支时,将所有的项目文件都复制一遍,并保存到一个特定的目录。 完成这样繁琐的过程通常需要好几秒钟,有时甚至需要好几分钟。所需时间的长短,完全取决于项目的规模。 而在 Git 中,任何规模的项目都能在瞬间创建新分支。 同时,由于每次提交都会记录父对象,所以寻找恰当的合并基础(译注:即共同祖先)也是同样的简单和高效。 这些高效的特性使得 Git 鼓励开发人员频繁地创建和使用分支。