解决 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
合并两个分支时的冲突。
相关文章
如何在 Windows 系统中卸载 git
发布时间:2023/04/09 浏览次数:223 分类:Git
-
在这篇简短的文章中,我们将学习如何卸载 Git,以及如何在从个人计算机的目录中卸载 Git 后删除这些文件。
Git 如何重命名本地分支
发布时间:2023/04/09 浏览次数:64 分类:Git
-
大多数情况下,重命名分支机构是由于上述情况。 因此,在本教程中,我们将学习使用下面提到的技术更改本地 Git 分支的名称。
重命名 Git 存储库中的文件和目录
发布时间:2023/04/09 浏览次数:102 分类:Git
-
在本文中,我们将讨论 git 中的重命名过程。 我们使用 Git Rename 来更改工作目录中文件和文件夹的名称。
在 Git 中取消初始化存储库
发布时间:2023/04/09 浏览次数:187 分类:Git
-
本本文介绍如何通过 Git 命令行取消初始化 Git 存储库。git init 命令开发一个新的空置 Git 存储库。 它还用于重新初始化已经存在的 Git 存储库。
Git 仓库名称该如何命名
发布时间:2023/04/09 浏览次数:208 分类:Git
-
使用 Git 时,选择一个简洁且最新的存储库名称是一项艰巨的任务。本教程介绍了如何以独特的方式命名 Git 存储库。
配置 Git 以忽略文件模式更改
发布时间:2023/04/09 浏览次数:67 分类:Git
-
本文讨论配置 Git 以忽略文件更改 chmod 所需的步骤。 如果您更改 Git 正在跟踪的文件的权限,系统将在该文件中注册更改。
在 Git 中暂存已删除的文件
发布时间:2023/04/09 浏览次数:93 分类:Git
-
本文讨论了在 Git 中暂存已删除文件的必要步骤。我们知道 rm 命令可以删除一个文件,而无需将其从工作目录中移除。 那么,我们如何暂存已删除的文件以进行提交呢?
在 Git 中显示冲突文件
发布时间:2023/04/09 浏览次数:139 分类:Git
-
本文讨论在 Git 中列出冲突文件的最简单和最干净的方法。 我们可以使用 git status 命令,但这很麻烦,尤其是当我们有大量不冲突的文件时。