承志算法课堂|图解git,用手绘图带你理解git中分支的原理和应用


大家好 , 今天我们来聊git当中一个非常非常重要的特性 , 就是branch 。
git branch可以说是git当中最重要的概念了 , 甚至没有之一 。 因为git最重要的使用场景就是协同开发 , 大家一起在一个项目当中开发不同的功能 。 正是由于有了分支的概念 , 可以让大家在开发的时候互不影响 。 如果没有这个功能 , git的其他功能做的再好 , 可能都没有用 。
所以某种程度上可以理解为 , 学git最重要的就是学习分支的相关内容 。 当然分支的相关内容和命令非常多 , 我们想要瞬间全部都学会显然不太现实 。 但对这个概念有一些理解 , 懂得一些基本命令的用法应该还是做得到的 。
在理解分支这个概念之前 , 我们需要先来介绍一下Git的结构 。
branch的英文就是树枝 , 后来衍生出了分叉、支路等意思 。 这个单词非常形象 , 因为git仓库的所有提交节点之间的关系 , 其实就是一棵树 , 所以一个分支也可以看成是树上的一条链路 。 但是这样有一个小问题是 , 如果说分支是一条链路的话 , 那么这个链路上的每一个节点代表的是一个commit提交 , 意味着一份代码快照 , 有些像是游戏存档 。

一个branch上有多个commit , 一个游戏也可以有多个存档 , 但是当下显然只能加载一个 。 所以git当中用一个指针指向当前加载的commit , 也就是说纵向来看一个分支代表的是一连串的提交 , 但在git当中我们使用的分支其实是一个指针 , 一个在commit当中切换的指针 。
我们来看个例子 , 比如一开始的时候我们只有默认分支master , 它指向当前的一个提交 。
承志算法课堂|图解git,用手绘图带你理解git中分支的原理和应用
本文插图

现在我们使用git branch test命令创建一个测试分支 , 执行之后 , 其实只不过是多了一个指针也指向当前的commit 。 git当中的结构变成这样:
承志算法课堂|图解git,用手绘图带你理解git中分支的原理和应用
本文插图

当我们在test分支上做了改动提交之后 , git会产生一个新的提交 , 并且移动test指针 , 而master指针会留在原地 。
承志算法课堂|图解git,用手绘图带你理解git中分支的原理和应用
本文插图

如果我们再回到master也进行了改动和提交之后 , 又会产生新的节点 , 并且这个节点会和test的节点区分开 , 形成新的链路 , 于是就形成了一棵树的样子 。
承志算法课堂|图解git,用手绘图带你理解git中分支的原理和应用
本文插图


怎么分支创建 , 我们刚才已经讲过了 , 可以通过git branch加上我们想要的分支名来完成 。 使用了这个命令之后 , git内部会创建一个新的指针指向当前的commit 。
有一个问题是git怎么知道我们当前的代码在哪里呢?即使知道了代码在哪个分支上 , 又怎么确定在哪一个节点呢?其实git内部还有一个特殊的指针叫做HEAD , 它指向的是当前代码仓库的位置 。 当我们提交代码的时候 , 不止只有分支的这些指针会往前移动 , HEAD指针也会随着移动 。
其实HEAD指针不仅可以往前移动 , 还可以移动到任意节点上 , 哪怕不再当前的分支上也可以 。 移动HEAD指针需要用到git checkout命令 , 它可以指定HEAD指针移动到其他位置 。 既可以是某一个分支 , 也可以是根据commit id来确定的节点 。
比如我们当前在master分支 , 我们要切换到test分支上 , 我们只需要运行:
git checkout master另外 , 使用git checkout命令加上参数-b , 我们还可以创建分支 。 比如假如当前test分支不存在 , 我们可以通过git checkout -b test来创建 , 并且还会自动切换到新建出的test分支上 。
承志算法课堂|图解git,用手绘图带你理解git中分支的原理和应用


推荐阅读