解决 Git 中的合并冲突
 
在本教程中,我们将演示如何解决在 Git 中合并两个分支时出现的冲突。
通常,协作团队环境中的不同团队成员通常对相同的文件进行工作。例如,一位从事某些功能开发的团队成员可能会编辑 README 文件以提供有关所开发功能的信息。
另一位致力于修复错误的团队成员可能会在同一个 README 文件中添加有关已修复错误的信息。他们可能在不同的分支上工作并在各自的分支中提交他们的更改。
有时,需要合并不同的分支以提供有凝聚力的构建。因此,在不同分支更新相同文件时,此操作会导致合并冲突。
然后需要解决冲突并合并更改。我们现在将通过一个例子来说明这一点。
使用 git mergetool 解决合并两个分支时出现的冲突
在解决合并冲突之前,我们应该设置 Git 使用的 diff 工具,如下所示。
$ git config merge.tool meld
$ git config merge.conflictstyle diff3
$ git config mergetool.prompt false
上面的命令将 meld 设置为默认的 diff 工具。此外,我们已将 conflictstyle 设置为 diff3;这将 diff 工具设置为显示两个文件的共同祖先(当前分支一和分支中要合并的分支)。
要查看支持的不同差异工具,请运行以下命令。
$ git mergetool --tool-help
现在,我们从示例开始演示如何解决冲突。假设我们有两个分支,如下所示。
$ git branch
* main
  feature1
第一个分支是 main 分支,第二个是名为 feature1 的功能开发分支。
我们在 main 分支中有一个 README.md 文件,其内容如下。
$ cat README.md
# Upwork
Upwork projects
如上所示,我们目前在 main 分支。然后,我们切换到 feature1 分支。
$ git checkout feature1
Switched to branch 'feature1'
$ git branch
  main
* feature1
我们更新 README.md 并打印其内容如下。
$ cat README.md
This is conflicting branch line.
现在,我们将 main 分支与 feature1 分支合并以获取该分支中的最新更改。
合并时,Git 显示合并冲突如下。
$ git merge main
Auto-merging README.md
CONFLICT (add/add): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
我们可以通过以下方式获得有关冲突的更多信息。
$ git status
On branch feature1
You have unmerged paths.
  (fix conflicts and run "git commit")
Unmerged paths:
  (use "git add <file>..." to mark resolution)
	both added:      README.md
no changes added to commit (use "git add" and/or "git commit -a")
我们现在将打印文件 README.md 的内容,该文件存在冲突。
$ cat README.md 
<<<<<<< HEAD
This is conflicting branch line.
||||||| merged common ancestors
=======
# Upwork
Upwork projects
>>>>>>> main
该文件现在显示了各种符号。
符号 <<<<<<< 后跟 HEAD 是当前分支的别名。这表示此部分中编辑的开始。
======== 符号表示当前分支中修订的结束和新分支中编辑的开始。
符号 >>>>>>>> 后跟远程分支名称,即 main,显示尝试合并的位置。
现在,我们将使用 mergetool 来解决冲突。
$ git mergetool
Merging:
README.md
Normal merge conflict for 'README.md':
  {local}: created file
  {remote}: created file
这将启动 meld(因为我们已将其设置为默认差异工具)。请看下图。

左窗格显示在本地分支中对文件 README.md 所做的编辑。中间窗格包含为解决冲突所做的更改结果。右窗格显示在远程分支(即我们要合并的分支)中的编辑内容,即 main。
我们可以选择保留本地和远程更改或其中之一。我们将选择保持远程分支更改如下。

然后我们将保存并退出 meld 工具。
我们将打印 README.md 文件并查看更新。
$ cat README.md
# Upwork
Upwork projects
我们现在将更改提交到 Git。
$ git commit -m "merged from main"
[feature1 3c39d7b] merged from main
我们现在将运行 git diff 命令来检查 feature1 和 main 分支之间的冲突。
$ git diff feature1 main
我们将检查 feature1 分支的状态。
$ git status
On branch feature1
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	README.md.orig
它显示了一个文件 README.md.orig,它是在合并时由 mergetool 创建的。
运行以下命令将其删除:
$ git clean -f
因此,我们已经成功解决了使用 Git 的 mergetool 合并两个分支时的冲突。