前言:
上一章我们讲解了分支的创建和删除,以及对误删分支的恢复操作,git stash挂起分支修改。在这一讲我们则重点讲解分支合并git merge以及如何解决合并冲突。
目录
课前准备:
下载并解压资源
https://download.csdn.net/download/qq_17204647/86969196?spm=1001.2014.3001.5503
选择make_merge_repos.sh,make_merge_ff.sh到你git操作的目录下。
9.1 合并分支
分支的合并首先你至少要有两个分支,git默认将分支合并到你当前所在的分支。
实际操作:
在git目录下,输入下面命令
bash make_merge_repos.sh
然后你会得到一个mergesample文件夹,输入下面命令
cd mergesample //进入mergesample文件
git lol //上一章节设置的缩写 查看整个项目分支情况
得到如图:
可以看到我们有两个分支,master和bugfix,而我们要做的是bugfix分支合并到master分支中去。
在此之前,我们可以先分析一下我们的文件,切换到master分支,然后运行文件夹中baz文件
git checkout master
bash baz
结果如下图
运行显示错误,而打开baz文件,我们可以知道是因为代码分母设置为 0 导致的错误。
切换分支,再次运行该文件
git checkout bugfix
bash baz
得到结果如图
由此可知,分支是为了修复代码bug,修复完成后,我们需要将分支合并。
9.1.1 git diff
在合并时,git会分析两个分支文件的不同,我们可以通过git diff查看。
git diff master...bugfix
得到如下图
diff中显示的是分支合并时,baz文件将会有的变化。
输入如下命令
git diff --name-status master...bugfix
得到右图,
这是显示合并时改变的文件,M表示merge,将会把baz合并到master分支。
9.1.2 git merge
真正合并时,记得一定要先切换到你想要合并的主分支。因为当你运行git merge时,默认将分支合并到你当前的分支。
一般来讲,会有一个主分支(可以是master或其他),融合所有的分支。
命令如下
git checkout master
git merge bugfit
当你运行时,git可能会打开你默认的编辑器,关闭就好。得到结果如下图
合并分支后,查看git分支如图
当然,上面所有的操作都可以在git gui 中操作。
将原先文件删除,重新生成mergesample文件夹,命令如下
cd .. //返回上级目录
rm -rf mergesample //删除mergesample文件
bash make_merge_repos.sh //重新生成mergesample文件
cd mergesample //进入mergesample文件
git checkout master //切换到master分支
git gui //打开git gui
然后选择Merge > Local Merge
在新打开的窗口选择merge,就能够将分支合并。
9.2 git合并冲突
上一章中的合并时简单的分支合并,所以没有任何冲突,git能够自动决定如何合并两个分支的文件。但是实际上有时情况比较复杂,合并的时候就会导致冲突(实际上是git无法决定如何将修改合并)。
简单点解释,git合并是求同存异的一个过程,选择git分歧的部分,然后选择其中某一个作为最终版本。但是如果两个分支对同一个地方都有修改,git就不知道该选择哪一个,这个时候冲突就出现了,而我们要做的就是从两个分支中手动选择最后要保留的版本。
操作如下:
重新生成mergesample文件操作,切换到master分支,对baz分支进行修改。
git checkout master //切换到master分支
echo 'printf "The answer is %d" %c' >> baz //输入文本到baz
git commit -a -m "Adding printf" //提交修改
然后我们在尝试分支合并,结果如图
可以看到,合并分支失败,因为有baz文件冲突。
而为了更直观看到冲突的代码,我们可以借用第三方工具。这里我们因为是windows系统所以选择KDiff3.
9.2.1 merge tool
KDiff3下载网址
KDiff3 download | SourceForge.net
下载并安装后,记住安装的位置,因为我们要在git中配置kdiff3.
配置方式一
git config --global merge.tool "kdiff3"
git config --global mergetool.kdiff3.path "ftware\KDiff3\kdiff3.exe(kdiff3安装路径)"
或者打开属性文件,自己修改
git config --global --edit
配置好后,我们使用第三方工具,解决冲突
git mergetool
得到如下图
我们点击下面?<Merge conglict>位置,选择B或是C,变为下图
然后保存文件,合并冲突工具自动检测冲突是否全部解决,解决了会在最下面显示如图信息
最后,提交修改,就完成分支的合并。(这里不需要git add,因为kdiff3已经自动做过这个操作了,你只需要提交就可以。如果你疑惑自己的git工具在解决冲突后是否需要Git add,可以通过git status查看状态。)
git commit
9.3 放弃分支合并
有时候因为你选择了错误的分支合并,或者忘记回到主分支再合并,需要放弃合并分支时:
在合并过程中发现错误,即diff时想要放弃合并分支 ,输入下面命令即可
git merge --abort
如果你已经执行合并后才发现错误,想要退回操作,这个情况比较复杂,我会在之后详细说明。
9.4 快速分支合并
在创建新分支后,主分支一直没有其他提交,这样可以实现快速分支合并。快速合并后,你可以继续提交新的文件到分支中,这样分支又会和master分支分叉开。如下图
实践操作:
运行 make_merge_ff.sh文件,得到ff文件夹。进入ff文件夹,
bash make_merge_ff.sh
cd ff
通过gui查看分支情况
gitk
得到如下图
切换到master分支,并合并new_feature,结果下图
可知git能够识别快速合并分支的情况。