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