快照管理方式
在Git本地文件管理一文中,给出了Git如何将修改变为快照的方法。本文将会给出Git管理快照的方式——分支树。
Git使用链式结构组织提交,并使用hash标识链上的各个节点。但是,为了便于协作,需要一种方式使得Git能够使用一种方式使得多个人能够对项目的不同部分进行修改和提交。Git使用分支的方式提供这一服务。引入分支后,Git中的快照从原本的链型变成了树形:

分支
分支的实质
一个分支实质上是一条快照链表,其具有一个头指针,其指向当前快照链表的头。多个分支具有共同部分,于是连成树形:

创建分支
创建分支实质上是创建一个分支头指针,该头指针与其他指针相互独立:

在两个分支分别完成一笔提交后,Git内部变为下图:

切换分支
切换分支实质上是切换头节点指向的分支,如果上图中切换到b0分支的话,Git内部变为下图:

合并分支
合并分支是Git分支最重要的操作之一。其实质上是将两个分支后新建一个包含两个分支更改的新分支:

合并后的新节点包换合并的两个分支的全部修改,其具体计算方式如下:
找到合并的两个节点所在链表的分叉点。
通过
git diff的方式获得两个节点相对于分叉点的修改。将两份修改进行合并,产生新的镜像。
可以看出,在这一过程中,如果合并节点在同一位置更改存在不同的更改,这将产生冲突。此时需要管理员手动解决该项冲突,之后继续合并即可。
分支的持久化存储
分支头指针存储
各个分支头指针存储在项目路径下的.git/refs/heads中,其中使用分支名作为对应的文件名,存储着该分支头指针指向的节点的标识。
HEAD存储
HEAD的引用存储在项目路径下的.git/HEAD文件中,其内容为目前其指向的分支头或是其指向的镜像的hash标识符。