当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!
不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:
所以Git合并分支也很快!就改改指针,工作区内容也不变!
合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:
在上面,已经介绍了分支的概念及其断链、成链的原理过程,下面我们通过Git命令来完成分支的创建与合并。
在Git中,我们可以通过git branch来查看有哪些分支、git branch xxx来创建一个分支,其中带有*号的表示当前分支、git checkout xxx来切换分支:
1# 创建一个名为dev的分支2$ git branch dev
3# 从master分支切换到dev分支中
4$ git checkout dev
5# 查看当前有多少分支
6$ git branch
7
8# 此外,我们还实现分支的创建、切换这两个操作合并执行
9$ git checkout -b dev
现在,我们不妨在刚刚创建的dev分支中对paper.txt的内容进行编辑,在最下方添加这么一句话:I'm writing the content of my paper.。编辑完成并保存之后,我们提交到版本 库,并再次切换到master分支,使用cat命令来查看paper.txt的内容。
1$ git checkout dev # 切换到dev分支2$ vim paper.txt # 编辑paper.txt,并增添一句话
3$ git add paper.txt # 添加到暂存区
4$ git commit -m "writing the content of this paper" paper.txt # 提交到版本库
5$ cat paper.txt # 查看paper.txt内容
6$ git checkout master # 再次切换到master分支
7$ cat paper.txt # 查看paper.txt内容
采用cat命令两次查看paper.txt内容时,我们会发现在执行后一次命令时,paper.txt中的内容并没有添加新增的一句话,这主要是因为我们刚刚采用vim编辑paper.txt的时候是基于dev分支进行的,提交也是提交到dev分支,而非master分支,所以当我们切换到master分支的时候并不能够看见paper.txt编辑后的内容。如下图所示:
而我们要想在master分支中查看到paper.txt的新内容,则需要将dev分支合并到master主分支中才行,采用的是git merge命令,操作如下:
1$ git checkout master2$ git merge dev
合并完成之后,dev的任务已经完成了,也就没有必要存在了,可以通过git branch -d xxx来删除分支:
1$ git branch -d env2Deleted branch env (was e9c7421).
单人分支合并时的冲突解决
在编程的世界里,多进程占据了一个举足轻重的地位。在高并发、高流量的场景下,我们一般通过多进程来提高项目的服务效率,以便提高用户体验。话虽如此,但是在使用多进程的时候,许多问题同样会慢慢浮出水面。同样地,Git分支虽然能够方便多个的用户协同开发,但是将多个不同内容的分支进行合并的时候却会产生冲突,作为一个对技术有追求的Coder,我们应该要理解为什么会产生冲突,以及产生冲突后我们应该怎样解决。
出现冲突的场景:
切换到dev分支后,对paper.txt进行编辑,然后将保存后的文件提交到版本库中。
切换到master分支,对paper.txt进行编辑,将保存后的文件提交到版本库。