分支简介
Git 保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。这是 Git 与几乎所有其它版本控制系统的重要区别,更多信息可以参考git基础。
Git每次提交的会有三类对象:多个blob 对象(保存着文件快照)、一个树对象(记录着目录结构和 blob 对象索引)以及一个提交对象(包含着指向前述树对象的指针和所有提交信息)。
Git 的分支,其实本质上仅仅是指向提交对象的可变指针。 Git 的默认分支名字是 master。 在多次提交操作之后,你其实已经有一个指向最后那个提交对象的 master 分支。 它会在每次的提交操作中自动向前移动。(master分支只是git默认的分支名,没有任何的特殊意义,只是大部分人懒得改。)
分支创建
首先做一下准备工作,我在本地初始化了一个git仓库,并且提交了三条信息, 执行git log:
然后我们创建分支:
git branch testing
执行后静默成功,再次执行git log:
这里我们可以看到只有最新的提交上面多了个testing,其他没有任何变化,下面来解释下:
最开始, master 分支指向最新的提交,对应上方的第一张图:
HEAD 的特殊指针,在 Git 中指向当前所在的本地分支,这样就能区分当前位于哪个分支(在第二章图中可以看见Head指向master):
分支切换
切换到testing分支
git checkout testing
此时HEAD指向testing分支
执行一下命令,可以查看所有分支的提交和分叉情况, 从下图可以看到testing和master分别指向一个提交,
HEAD指向master分支:
git log --oneline --decorate --graph --all
小结
由于 Git 的分支实质上仅是包含所指对象校验和(长度为 40 的 SHA-1 值字符串)的文件,所以它的创建和销毁都异常高效。 创建一个新分支就相当于往一个文件中写入 41 个字节(40 个字符和 1 个换行符),所以创建分支特变快。
同时,HEAD这个指向当前分支的指针,使切换分支异常简单,切换分支时,实际上就是HEAD的指向发生了变化,从一个分支指向了另一个分支。