昨天分享了关于分支合并相关的内容,通常情况下,合并分支时往往伴随着冲突的发生。今天这篇分享将介绍解决这种冲突的方法。
4 解决合并分支时的冲突
4.1 准备演示环境
- 在空文件夹中使用命令
git init初始化一个空仓库 - 使用命令
echo "hello" >> README.md创建README.md文件 - 使用命令
git add . && git commit -m "初始化仓库"提交修改,请注意,这里没有使用命令git commit -am "初始化仓库",因为README.md文件是未追踪的 - 使用命令
git checkout -b example创建并切换example分支 - 使用命令
echo "hello, example" >> a.txt创建文件,并在其中写上一段话 - 使用命令
git add . && git commit -m "example分支修改"提交修改 - 使用命令
git checkout master切换值主分支 - 使用命令
echo "hello, master" >> a.txt创建文件,并在其中写上一段话 - 使用命令命令
git add . && git commit -m "master分支提交"提交修改
4.2 查看合并冲突详细信息
在前面的演示环境中,master分支和example分支均修改了a.txt文件,并且都是修改的第一行。在Git中,如果两个分支均修改同一文件并且同一部分,则会引起合并冲突。这时候,将example分支合并至master分支时,会得到如下的效果:
$ git merge example
CONFLICT (add/add): Merge conflict in a.txt
Auto-merging a.txt
Automatic merge failed; fix conflicts and then commit the result.
上面的输出只能告诉我们,此次合并是不成功的,并列出了哪些文件没有合并成功。可以使用命令git status查看更详细的信息:
$ 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 added: a.txt
no changes added to commit (use "git add" and/or "git commit -a")
这里我们可以看到,在master分支上有一些没有合并的文件,这些文件是否在在两个分支上都被修改了。
这时如果查看a.txt文件的内容,其实会发现,相比合并操作之前的文件,还是有些变化的。
$ cat a.txt
<<<<<<< HEAD
hello, master
=======
hello, example
>>>>>>> example
其中呢,<<<<<<< HEAD与=======之间的内容表示当前分支上的修改的内容,=======与>>>>>>> example之间的内容表示example分支上的修改内容。
4.3 合并冲突简易解法
类似4.2节中这种不算复杂的合并冲突,可以通过在文件编辑中,将不想要的内容删除,然后执行git commit -am命令将修改后的文件提交。
Git中也默认提供了图形化工具来解决合并冲突,命令是git mergetool,这里提前安装并配置了meld工具,具体配置请访问该博客。
$ git mergetool
Merging:
a.txt
Normal merge conflict for 'a.txt':
{local}: created file
{remote}: created file
Couldn't set the locale: unsupported locale setting; falling back to 'C' locale
(meld:9868): Gtk-WARNING **: 23:06:25.520: Locale not supported by C library.
Using the fallback 'C' locale.
在合并工具中,解决合并冲突直到自己满意为止。退出合并工具后,Git将会询问是否已完成合并,如果“是”,将会把合并后的文件提交到暂存区,然后使用git commit将合并后的文件提交到版本仓库。
4.4. 解决复杂的合并冲突
在4.3节中介绍了,在了解4.2节中介绍的文件冲突状态的基础上,可以使用一些图形化Git工具或者文件编辑器修改合并冲突。
但是,在项目开发过程中,常常会遇到复杂的合并冲突的情况,这种情况下,上述方法解决起来会有些麻烦,在解决的过程中,需要使用一些高阶的Git命令,主要的有以下5种情况,详细内容呢这里先不介绍了。
- 中止合并,相关的命令:
git merge --abort - 忽略空白字符,相关的命令:
git merge -Xignore-space-between whitespace - 手动处理文件并提交,相关的命令:
git show :1:<file_name> >> <new_file_name> - 检出冲突,相关的命令:
git checkout --conflict=diff3 <file_name> - 合并日志,相关的命令:
git log --online --left-right --merge - 组合式差异格式,相关的命令:
git diff等