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