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 合并(包括合并冲突解决)的更高级信息。
评论已关闭。