Git分支(三)

188 阅读3分钟

昨天分享了关于分支合并相关的内容,通常情况下,合并分支时往往伴随着冲突的发生。今天这篇分享将介绍解决这种冲突的方法。

4 解决合并分支时的冲突

4.1 准备演示环境

  1. 在空文件夹中使用命令git init初始化一个空仓库
  2. 使用命令echo "hello" >> README.md创建README.md文件
  3. 使用命令git add . && git commit -m "初始化仓库"提交修改,请注意,这里没有使用命令git commit -am "初始化仓库",因为README.md文件是未追踪的
  4. 使用命令git checkout -b example创建并切换example分支
  5. 使用命令echo "hello, example" >> a.txt创建文件,并在其中写上一段话
  6. 使用命令git add . && git commit -m "example分支修改"提交修改
  7. 使用命令git checkout master切换值主分支
  8. 使用命令echo "hello, master" >> a.txt创建文件,并在其中写上一段话
  9. 使用命令命令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