Git 分支(一)

415 阅读3分钟

分支简介

Git 保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。这是 Git 与几乎所有其它版本控制系统的重要区别,更多信息可以参考git基础
Git每次提交的会有三类对象:多个blob 对象(保存着文件快照)、一个树对象(记录着目录结构和 blob 对象索引)以及一个提交对象(包含着指向前述树对象的指针和所有提交信息)。
Git 的分支,其实本质上仅仅是指向提交对象的可变指针。 Git 的默认分支名字是 master。 在多次提交操作之后,你其实已经有一个指向最后那个提交对象的 master 分支。 它会在每次的提交操作中自动向前移动。(master分支只是git默认的分支名,没有任何的特殊意义,只是大部分人懒得改。)

分支创建

首先做一下准备工作,我在本地初始化了一个git仓库,并且提交了三条信息, 执行git log
      

深度截图_选择区域_20191024092657.png

然后我们创建分支:

git branch testing

执行后静默成功,再次执行git log

深度截图_选择区域_20191024092937.png

这里我们可以看到只有最新的提交上面多了个testing,其他没有任何变化,下面来解释下:
最开始, master 分支指向最新的提交,对应上方的第一张图:
创建testing分支后,testing分支指向当前提交,也就是最新提交:
最后这个叫作 HEAD 的特殊指针,在 Git 中指向当前所在的本地分支,这样就能区分当前位于哪个分支(在第二章图中可以看见Head指向master):

分支切换

切换到testing分支

git checkout testing

此时HEAD指向testing分支

深度截图_选择区域_20191024145629.png
此时我们在testing分支提交一次修改, 可以看到testing分支指向最新提交,HEAD指向testing,master分支没动:
深度截图_选择区域_20191024150102.png
此时切换回master分支,并提交一个commit,这里看不见之前在testing分支的提交,因为那个提交是testing分支独有的:
深度截图_选择区域_20191024150529.png

执行一下命令,可以查看所有分支的提交和分叉情况, 从下图可以看到testing和master分别指向一个提交,HEAD指向master分支:

git log --oneline --decorate --graph --all

深度截图_选择区域_20191024150653.png

小结

由于 Git 的分支实质上仅是包含所指对象校验和(长度为 40 的 SHA-1 值字符串)的文件,所以它的创建和销毁都异常高效。 创建一个新分支就相当于往一个文件中写入 41 个字节(40 个字符和 1 个换行符),所以创建分支特变快。
同时,HEAD这个指向当前分支的指针,使切换分支异常简单,切换分支时,实际上就是HEAD的指向发生了变化,从一个分支指向了另一个分支。