解决 Git 中的合并冲突

Azhar Bashir Khan 2022年4月1日
解决 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(因为我们已将其设置为默认差异工具)。请看下图。

git-mergetool-meld1

左窗格显示在本地分支中对文件 README.md 所做的编辑。中间窗格包含为解决冲突所做的更改结果。右窗格显示在远程分支(即我们要合并的分支)中的编辑内容,即 main

我们可以选择保留本地和远程更改或其中之一。我们将选择保持远程分支更改如下。

git-mergetool-meld2

然后我们将保存并退出 meld 工具。

我们将打印 README.md 文件并查看更新。

$ cat README.md
# Upwork
Upwork projects

我们现在将更改提交到 Git。

$ git commit -m "merged from main"
[feature1 3c39d7b] merged from main

我们现在将运行 git diff 命令来检查 feature1main 分支之间的冲突。

$ 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 合并两个分支时的冲突。

相关文章 - Git Merge