10. 合并分支并解决冲突(conflict)
1) 合并分支
在代码管理过程中,切换分支或者同步服务器代码时,常常会出现代码冲突的情况,这种情况出现的原因一般是由于两个分支对同一个文件进行修改,
当把这两个分支进行合并时就有可能会出现冲突(pull远程服务器上的代码是一样的道理)。
以Test仓库为例,主分支 master 对19264.h文件进行了修改并进行了多次提交,在主分支中对19264.h文件的 lcd_delay_us 函数进行了修改(增加了几条注释),
而另一条分支 testconflict 删除了该文件中的这一函数(也可以是添加了其它的注释或者改动这一部分的代码)。
也就是说,19264.h头文件被多次修改了(在实际的代码编写过程中,一般就对应着多人修改同一个文件的情况)
图 4‑1 提交记录
右键点击testconflict分支,在下拉菜单中选择Merge testconflict into master 这一项:
图 4‑2 下拉菜单
程序将会尝试将testconflict分支并入master分支。然而这两条分支是有代码冲突的,接下来程序就会在最新的提交记录位置提示我们:
图 4‑3代码冲突提示
2) 代码出现冲突
合并分支出现代码冲突后,程序右侧将会给出发生冲突的文件列表(Conflicted Files)和无冲突的文件列表(Resolved Files)如下图:
图 4‑4 文件列表
点击发生冲突的“19264.h”文件,GitKraken将会进入Diff View视图:
图 4‑5文件比较视图
程序正中央显示了总共有一个冲突发生:
图 4‑6发生的冲突
点击箭头按钮可以快速定位到发生冲突的地方。
左侧的 部分显示的是 master 分支中提交记录的文件内容,在20~22行后面添加了一些注释;右侧的 部分显示的 testconflict 分支中提交记录的文件内容,
可以看到 15行的 #define 定义下面的函数是 lcd_delay_ms 函数而不是 lcd_delay_us 函数,也就是之前提到的删除了 lcd_delay_us 函数。
下方的Output显示的是最终将会保留的文件内容。
3) 解决冲突
当代码出现冲突后,需要手动解决冲突。在代码冲突的位置, 两部分各有一个复选框。若点击 侧的复选框,将会保留master分支中对该段代码的修改:
图 4‑7 保留master分支对代码的修改
可以看到Output中将会保留这段函数代码及添加的注释。点击右上方的 按钮将会将Output框中显示的内容保存到文件中,即冲突被解决。
如果确定了需要保留 的所有代码,将 左边的复选框选中,将会保留master分支的所有更改:
图 4‑8 保留A的所有更改
如果只需要其中的一部分代码,可以点击 记号,取消这个标记,就像下图一样:
图 4‑9 保留部分更改
那么Output框中现实的内容就会变成这样的:
图 4‑10 输出结果
可以同时保留 中的部分修改,又保留 中的部分修改。最后解决冲突,保存文件。代码合并的工作就完成了。
完成以上工作后,需要对代码合并进行一次新的提交:
图 4‑11 合并分支并提交
填写合适的Commit Message,并点击 Commit and Merge 按钮。在提交记录区将会出现一个新的提交记录。
解决了代码冲突后,就可以继续进行代码编写了。从服务器上拉取(Pull)代码,有时也会提示代码冲突,原理与此类似,只是发生冲突的分支不同而已(一个是master分支,一个是 origin/master分支)。