如何解决 Git 合并冲突

当开发者以不同的方式更改同一行代码时,您该怎么办?
147 位读者喜欢这篇文章。
Brain on a computer screen

opensource.com

Git 是开源项目和许多闭源项目的标准源代码仓库管理器。本文向 Git 新用户展示如何执行一些稍微高级但对其目的至关重要的操作:解决 git 合并冲突。

什么是 git 合并?

所有现代源代码控制系统都具有一项基本功能:允许多个开发人员同时在同一个项目上工作,而不会互相干扰。Git 通过允许多个开发人员在本地的分支上工作,然后将其代码推送到中心位置来实现此功能。然后,其他人可以将代码拉回到他们的本地副本,并在他们的协作伙伴的更改就位的情况下继续他们自己的工作。

当您想将一个分支中的更改引入到当前分支时,您可以使用 git merge 命令。合并操作会将另一个分支中的所有更改应用到当前分支。

什么是合并冲突?

在任何可以并行工作的情况下,工作最终都会重叠。有时,两位开发人员会以两种不同的方式更改同一行代码;在这种情况下,Git 无法判断哪个版本是正确的——这只有开发人员才能决定。

如果发生这种情况,开发人员将在 git merge 期间看到以下错误

Auto-merging [filename1]
CONFLICT (content): Merge conflict in [filename1]
Automatic merge failed; fix conflicts and then commit the result.

解决合并冲突可能需要一分钟,也可能需要几天(如果有很多文件需要修复)。建议并且是良好的编码实践,每天多次通过 提交 (committing)推送 (pushing)拉取 (pulling)合并 (merging) 来同步您的代码。

如何解决 git 合并冲突?

Git 在其错误消息中提供了解决冲突的线索。它显示 Merge conflict in [filename1],因此您知道该文件存在问题。然后它说 fix conflicts and then commit the result,因此如果您按照指示,编辑文件,然后提交,一切都应该正常工作。让我们看看实际操作。

创建一个新的 Git 仓库,添加一个文件,创建一个分支,进行一些冲突编辑,看看它是什么样子。

从一个空目录开始并运行 git init

$ ls -l
$ git init
Initialized empty Git repository in /home/bob/example/.git/
$

现在创建一个 README 文件并提交更改

$ echo "This is a new README file" > README.md
$ cat README.md
This is a new README file
$ git add README.md
$ git commit -m "README file added"
1 file changed, 1 insertion(+)
create mode 100644 README.md
$ git status
On branch master
nothing to commit, working tree clean
$

创建一个新分支

$ git checkout -b "branch_to_create_merge_conflict"
Switched to a new branch 'branch_to_create_merge_conflict'

在新分支上

$ git branch
* branch_to_create_merge_conflict
master

进行编辑

This is a new README file

This is an edit on the branch

现在提交该编辑

$ vim README.md
$ git add README.md
$ git commit -m "Edits made to README on the branch"
[branch_to_create_merge_conflict 9c5e88a] Edits made to README on the branch
1 file changed, 2 insertions(+)

返回到主分支,在第 3 行用不同的内容编辑 README,并提交。

切换到主分支

$ git checkout master
Switched to branch 'master'

编辑 README

This is a new README file

This is an edit on the master branch

提交编辑

$ git add README.md
$ git commit -m "Edits made to README on the master branch"
[master 7ea2985] Edits made to README on the master branch
1 file changed, 2 insertions(+)

将分支合并到主分支以查看错误

$ git branch
  branch_to_create_merge_conflict
* master
$ git merge branch_to_create_merge_conflict
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

现在,按照 Git 的要求,进入 README 文件,看看它是什么样子

This is a new README file

<<<<<<< HEAD
This is an edit on the master branch
=======	
This is an edit on the branch
>>>>>>> branch_to_create_merge_conflict

正如您所看到的,Git 添加了一些语法,包括七个“小于”字符 <<<<<<< 和七个“大于”字符 >>>>>>>,中间用七个等号 ======= 分隔。可以使用您的编辑器搜索这些字符,以快速找到需要进行编辑的位置。

此块中有两个部分

  • “小于”字符表示当前分支的编辑(在本例中为“HEAD”,它是当前分支的另一个名称),等号表示第一部分的结尾。
  • 第二部分是尝试合并的编辑来源;它以等号开头,以“大于”号结尾。

作为开发人员,您决定保留什么和删除什么。根据需要进行编辑,然后关闭文件

This is a new README file

This is an edit on the branch

正如您所看到的,这保留了分支的编辑。您可以运行 git status 以查看进一步的说明

$ vim README.md
$ 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 ..." to mark resolution)
  both modified: README.md
no changes added to commit (use "git add" and/or "git commit -a")

请注意,如果您遇到严重问题,您可以通过运行 git merge --abort 来中止合并。

按照说明添加文件,然后提交

$ git add README.md
$ git status
On branch master
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)

Changes to be committed:
modified: README.md

$ git commit
[master 9937ca4] Merge branch 'branch_to_create_merge_conflict'

主要要点和延伸阅读

合并冲突在任何规模的团队中都会发生,只要时间足够长。重要的是能够以清晰的头脑解决它们。作为一名开发人员,我曾被 10 多个文件合并冲突问题搞得不知所措。了解当您遇到合并冲突时所看到的内容,对于解决问题大有帮助。

我没有介绍在集成开发环境中解决合并冲突的情况。了解如何使用 Git 命令行工具,包括修复合并冲突,对于理解 Git 以及能够在任何环境中处理 Git 至关重要。

如果您遇到困难,Git 的网站和文档是很好的资源。您可以在 Git Pro 书籍的高级合并部分找到关于 Git 合并(包括合并冲突解决)的更高级信息。

接下来阅读什么
标签
User profile image.
我叫 Brian Breniser。我是 Red Hat 在美国西海岸工作的顾问。我的专长是软件开发、敏捷开发、CI/CD,我热爱一切开源事物!

评论已关闭。

© . All rights reserved.