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


本文插图


我们在新的分支上做了提交之后 , 可以通过git log --oneline --decorate命令来查看每一个分支所指向的位置 。 这里的oneline是将log压缩到一行展示 , decorate用来查看分支所指向的位置 。
承志算法课堂|图解git,用手绘图带你理解git中分支的原理和应用
本文插图

我们可以发现test和master分支指向的提交不同 , 并且当前我们的HEAD在test上 , 说明我们当前在test分支 。 我们前面说了git checkout命令可以改变HEAD指针指向的位置 , 假如我们在当前目录下执行git checkout 18a417 , 这个18a417对应的是add article 6这个提交 。 这个提交是在master分支的 , 是test分支的上游 , 我们使用命令会自动将HEAD跳转到master分支 。
承志算法课堂|图解git,用手绘图带你理解git中分支的原理和应用
本文插图

使用之后我们发现的确到了master分支 , 这里由于我配置了zsh工具 , 它会提示我当前所处的位置是比master分支指向的最新位置落后3个提交 。
这也验证了我们说的 , HEAD指针可以随意跳转 。 现在想必你们应该能理解上一篇文章当中介绍的 , 撤销当前分支的命令git reset HEAD^的含义了 , HEAD指的就是HEAD指针 , ^表示的上一个提交 。 如果是前多个提交 , 我们可以用~加数字的形式来表示 。 比如上图当中划了红线标注的master~3 , 就表示master节点上3个提交 。

最后来简单说说分支合并 , 我们在使用git进行协同开发的过程当中 , 虽然大家都在各自的分支 。 但是最后代码还是要合并到一起的 , 这样才可以投入使用 。 git当中代码的合并是通过分支合并来体现的 。
比如当前的这一篇文章被我加在了test分支当中 , 这显然是不行的 , 因为使用方不可能一一去理解每一个分支做了什么 , 当中的代码逻辑 。 所以大多数的分支只是暂时的 , 用来暂时完成一项功能的 , 等功能完成之后 , 一般都会再合并回master分支 , 将所有的改动合并进去 。
合并的方式非常简单 , 我们只需要先checkout我们想要合并的目标分支 。 比如我们要合并到master , 就checkout到master 。 然后使用git merge test命令 , 表示和test这个分支合并 。
承志算法课堂|图解git,用手绘图带你理解git中分支的原理和应用
本文插图

合并之后 , 如果没有报错就算是合并成功了 。 它会展示出来合并进来的代码改动 , 我们注意到日志里有一个fast-forward这个单词 , 它表示快速合并 。 快速合并的意思也很简单 , 因为我们test分支是从master分支当中切出去的 。 后来master分支就再也没有进行过改动 , 那么当我们合并的时候 , 其实只需要移动一下master指针 , 将它移动到test分支上即可 。
我们用图来展示 , 合并前:

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

合并后:
承志算法课堂|图解git,用手绘图带你理解git中分支的原理和应用
本文插图
【承志算法课堂|图解git,用手绘图带你理解git中分支的原理和应用】

那如果我们在master分支上也有改动 , 不再是待合并分支的直接上游 , 会发生什么呢?
承志算法课堂|图解git,用手绘图带你理解git中分支的原理和应用
本文插图

上图当中我们做了一系列操作 , 首先我们创建了一个叫做test_merge的分支 , 在其中创建了一个文件叫做a.txt , 接着我们切回master分支创建了b.txt 。 最后我们把两个分支合并 。
合并当然也没有问题 , 但是我们来用git log来查看一下日志:


推荐阅读