Marco's Java【Git入门(三) 之 Git分支管理(创建与合并分支)】

前言

上一节我们重点分析过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命令可以看到分支合并图。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值