前言
上一节我们重点分析过Git的工作区、暂存区以及主分支区,主分支区其实就相当于我们的正式版,正式版版本有什么特性呢?
很稳定对吧!因此在实际开发中,我们肯定是不能直接将我们修改的内容Commit到主分支上去的吧?大家试想一下,假设我们玩DOTA正式服,游戏已经开始了,正当你Penta Kill的时候,后台在维护DOTA的程序猿一股脑的把刚刚写完修改好的程序直接提交到主分支,结果还是个有Bug的程序,导致你直接掉线?郁闷吧!
因此,当我们还在开发的时候,是不能直接提交代码到主分支master上,而是提交到开发分支dev,那么本节咱们就来学习如何创建分支,在不同分支上切换以及分支的合并。
创建与合并分支
在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长:
当我们创建新的分支,例如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 checkout -b dev | 创建dev 分支并切换到dev分支 |
git branch dev | 创建dev分支 |
git checkout dev | 切换到dev分支 |
git merge dev | 合并分支 |
git branch -d dev | 删除分支的命令 |
第一步:创建dev分支,然后切换到dev分支:
使用$ git checkout -b dev
指令创建并切换到dev开发分支,这个操作等同于git branch dev (创建dev分支)
以及git checkout dev (切换到dev分支)
这两个步骤
Marco@Marco-Laptop MINGW64 /d/git/repository (master)
$ git checkout -b dev #创建并切换到dev开发分支
Switched to a new branch 'dev'
第二步:用git branch命令查看当前分支:
可以看出来我们的dev分支已经创建成功了!
Marco@Marco-Laptop MINGW64 /d/git/repository (dev)
$ git branch
* dev #开发分支
master #主分支
git branch
命令会列出所有分支,当前分支前面会标一个*号。
然后,我们就可以在dev分支上正常提交,比如对tuofeilun.txt
做个修改,加上一行
第三步:修改txt文件并提交到dev分支:
Marco@Marco-Laptop MINGW64 /d/git/repository (dev)
$ cat tuofeilun.txt #修改文件并查看文件的内容
歌名:《陀飞轮》
填词:黄伟文
谱曲:Vincent Chow
歌曲原唱:陈奕迅
过去十八岁 没戴表 不过有时间
够我 没有后顾 野性贪玩
霎眼廿七岁 时日无多方不敢偷懒
宏愿纵未了 奋斗总不太晚 然后突然今秋
望望身边 应该有 已尽有...
我想去看Eason的演唱会!!!!
Eason真的太帅啦!!!
Marco@Marco-Laptop MINGW64 /d/git/repository (dev)
$ git add tuofeilun.txt #添加文件到暂存仓库
Marco@Marco-Laptop MINGW64 /d/git/repository (dev)
$ git commit -m "在dev上修改tuofeilun.txt" #提交文件到dev分支
[dev 020a90a] 在dev上修改tuofeilun.txt
1 file changed, 2 insertions(+), 1 deletion(-)
第四步:切换到master上查看:
使用指令$ git checkout master
进行切换
Marco@Marco-Laptop MINGW64 /d/git/repository (dev)
$ git checkout master #切换到master分支
Switched to branch 'master'
切换之后咱们,再查看tuofeilun.txt
文件,发现刚才添加的内容不见了!
因为那个提交是在dev分支上,而master分支此刻的提交点并没有变,此时master上的HEAD指针依然停留在未修改之前,这和VMware中的快照有点类似。
第五步:合并dev分支
现在,我们把dev分支的工作成果合并到master分支上之后,我们再来看看master里面的内容是否改变
Marco@Marco-Laptop MINGW64 /d/git/repository (master)
$ git merge dev #在master上合并dev分支
Updating 84af54b..020a90a
Fast-forward
tuofeilun.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
很明显,master分支里面的内容已经改变了对吧?git merge
命令就是用于合并指定分支到当前分支。因此合并后,我们再查看之前文件的的内容,就可以看到,和dev分支的最新提交是完全一样的。
第六步:创建dev分支,然后切换到dev分支:
细心的朋友可能会注意到当我们执行git merge dev
命令后,会出现Fast-forward
信息,这表示这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
合并完成后,就可以放心地使用git branch -d dev
删除dev分支了啦!删除之前记得切换到master分支哦!
Marco@Marco-Laptop MINGW64 /d/git/repository (master)
$ git branch -d dev #删除dev分支
Deleted branch dev (was 020a90a).
解决合并分支的冲突问题
万事万物被强行合并之后都会有互斥的现象发生,当然我们这里的分支合并也不例外,为什么这么说呢?
我们还是接着上面的栗子来讲吧!
我这边先创建并切换到dev分支,并master分支上修改文件的内容
Marco@Marco-Laptop MINGW64 /d/git/repository (dev)
$ cat tuofeilun.txt
歌名:《陀飞轮》
填词:黄伟文
谱曲:Vincent Chow
歌曲原唱:陈奕迅
过去十八岁 没戴表 不过有时间
够我 没有后顾 野性贪玩
霎眼廿七岁 时日无多方不敢偷懒
宏愿纵未了 奋斗总不太晚 然后突然今秋
望望身边 应该有 已尽有...
dev marco --- 留言:我喜欢Eason的《倾城》
然后,依次add到暂存区,然后commit到master分支上
Marco@Marco-Laptop MINGW64 /d/git/repository (dev)
$ git add tuofeilun.txt
Marco@Marco-Laptop MINGW64 /d/git/repository (dev)
$ git commit -m "在dev上修改tuofeilun.txt文件"
[dev 92d432f] 在dev上修改tuofeilun.txt文件
1 file changed, 2 insertions(+), 1 deletion(-)
接着切换到master分支并修改文件的内容
并依次add到暂存区,然后commit到master分支上
此时dev上commit的文件内容和master上的文件内容是不一致的,并且内容存在 “冲突” ,我们来看看会有什么效果!
Marco@Marco-Laptop MINGW64 /d/git/repository (master)
$ git merge dev #合并分支
Auto-merging tuofeilun.txt
CONFLICT (content): Merge conflict in tuofeilun.txt
Automatic merge failed; fix conflicts and then commit the result.
CONFLICT (content): Merge conflict in tuofeilun.txt
显示合并时有冲突产生?
如果出现这种情况就必须手动去更新里面的内容,然后再次commit提交,Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容,大家注意看后面蓝色括号里的内容,刚开始合并出现冲突的时候,括号里的内容是(master|MERGING)
,再重新提交到master分支区之后,才变回(master)
证明合并已经完成了!
小结
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。用git log --graph
命令可以看到分支合并图。