分支冲突

程序员在使用git merge命令分支合并时,一个经常遇到的错误就是不同的分支在合并时产生了分支冲突。
接下来,我们继续合并branch_b到master分支:

root@ubuntu:/home/test# git merge branch_b
Auto-merging test.c
CONFLICT (content): Merge conflict in test.c
Automatic merge failed; fix conflicts and then commit the result.

正常情况下,分支合并会自动完成,将要合并的分支上的修改自动添加到对应的文件中,如test.c文件,会自动将branch_a中的修改合并到master分支下的test.c文件中。因为branch_a分支和branch_b分支对同一个文件的相同位置做了修改,所以在合并branch_b时就会产生一个冲突,无法自动合并,需要我们手工介入,解决这种冲突。产生冲突时,我们可以先使用git status命令查看当前工作区的文件状态:

root@ubuntu:/home/test# git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)

    both modified:   test.c

no changes added to commit (use "git add" and/or "git commit -a")

根据提示信息,我们可以看到:你可以选择解决这个冲突,再次使用git commit提交;或者使用git merge —abort终止这次合并操作。我们的选择当然是:解决冲突,然后重新提交。

对于产生冲突而无法自动合并的文件,在unmerged paths下都会打印出来,我们直接修改这些产生冲突的文件就可以了,使用vim打开test.c文件:

#include <stdio.h>

<<<<<<< HEAD
int func_a(void)
=======
int func_b(void)
>>>>>>> branch_b
{
    return 0;
}

int main (void)
{
<<<<<<< HEAD
    func_a();
=======
    func_b();
>>>>>>> branch_b
    return 0;
}

因为test.c文件里保存的是branch_a和branch_b的所有修改,产生了冲突,无法自动合并,所以就变成了上面这个样子:<<<<<<和>>>>>>分别代表不同分支的提交,我们根据自己的需要进行取舍,重新修改test.c就可以了:

#include <stdio.h>

int func_a(void)
{
    return 0;
}
int func_b(void)
{
    return 0;
}

int main (void)
{
    func_a();
    func_b();
    return 0;
}

解决好冲突后,重新提交test.c:

root@ubuntu:/home/test# git add test.c
root@ubuntu:/home/test# git commit -m "master:fix merge conflicts"
[master bcb724d] master:fix merge conflicts

提交成功后,使用git log命令查看提交信息:

root@ubuntu:/home/test# git log
commit bcb724d948d710f12fcfb084101598359988e438 (HEAD -> master)
Merge: a547cfb 589f10d
Author: litao.wang <3284757626@qq.com>
Date:   Wed Sep 23 20:42:01 2020 -0700

    master:fix merge conflicts

commit 589f10d1016f9155f06dc8226f2fe9b5df22c1aa (branch_b)
Author: litao.wang <3284757626@qq.com>
Date:   Wed Sep 23 20:19:12 2020 -0700

    branch_b:add func_b to test.c

commit a547cfb0181767e9ef79dd37f4fb2ae94d85303d (branch_a)
Author: litao.wang <3284757626@qq.com>
Date:   Wed Sep 23 19:53:59 2020 -0700

    branch_a: add func_a to test.c

commit 62d21534ae082c61dc9e40196d5ff2265b4ca845
Author: “litao.wang” <3284757626@qq.com>
Date:   Wed Sep 23 18:43:44 2020 -0700

    Init test repo and add test.c to repo

通过提交信息我们可以看到:branch_a和branch_b分支上的修改都已经合并到了当前的master分支上,解决冲突作为额外的一个提交,也出现在了master分支上。

至此,分支合并与冲突解决的流程就结束了。分支合并和分支冲突解决是大家在实际项目开发中经常使用的操作,大家可以自己再把这个实验多练习几遍,用得熟了,工作中再遇到这样的坑,就知道该如何操作了。

《Linux三剑客》视频教程,从零开始快速掌握Linux开发常用的工具:Git、Makefile、vim、autotools、debug,免费赠送C语言视频教程,C语言项目实战:学生成绩管理系统。详情请点击淘宝链接:Linux三剑客