跳到主要内容

处理Git冲突

了解如何从命令行处理合并冲突

合并两个分支时,可能会出现各种类型的Git冲突。在此,您可以阅读如何处理最常见的问题。

提示

如果您是分布式版本控制系统的新手,请查看我们的Git入门指南,它将引导您逐步了解基础知识。

编辑冲突

当您和您的同事处理存储仓中的同一个文件,并且都对文件的同一部分进行更改,然后尝试将分支合并在一起时,这时就会发生编辑冲突。

当Git合并发生冲突时,Git会用两个版本冲突片段的内容写入一个特殊的区块,需要用文本编辑器手动编辑,然后添加回文件并提交。

当出现编辑冲突时,运行 git status 将产生如下消息:

# On branch buddy-1
# You have unmerged paths.
# (fix conflicts and run "git commit")
#
# 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")

这意味着你们俩都修改过的文件是README.md。在文本编辑器中打开文件后,您都会看到Git添加的额外区块:

世界上最好的蔬菜是
卷心菜

虽然显而易见的答案是“培根”,但由于某种原因,您的同事在同一个地方输入了“卷心菜”。但Git不知道选哪个,并用箭头标记了冲突的区域,将您的版本放在顶部,将您同事的版本放在底部。

要处理此冲突,您需要删除标记并保留正确的版本:

世界上最好的蔬菜是
培根

现在您可以 git add 文件,提交并继续合并。

移除文件冲突

当一个人编辑文件而另一个人在他们的分支中移除它时,就会出现这种冲突。 您可以决定将其与更改一起保留或完全丢弃。

假设您在 buddy-1 分支中的 README.md 中添加了一行,但您的同事已从分支 buddy-2 中完全删除了该文件。在这种情况下,Git会产生如下冲突消息:

CONFLICT (modify/delete): README.md deleted in HEAD and modified in buddy-1. Version buddy-1 of README.md left in tree.
# Automatic merge failed; fix conflicts and then commit the result.

git status
# On branch buddy-2
# You have unmerged paths.
# (fix conflicts and run "git commit")
# Unmerged paths:
# (use "git add/rm ..." as appropriate to mark resolution)
# deleted by us: README.md
no changes added to commit (use "git add" and/or "git commit -a")

保留已编辑文件

如果您要保留该文件,则需要将其添加回来并将其提交到存储仓中:

git add README.md

git commit
# [buddy-2 881fef7] Merge branch 'branch-1' into branch-2

git show | head
# commit 8454bf770a16b8f1ca0e7feed029d816811dd614
# Merge: 29fe539 0a880f2
# Author: bylek
# Date: Wed Nov 4 12:37:45 2015 +0200

# Merge branch 'buddy-1' into buddy-2
>
# Conflicts:
# README.md

移除文件

如果要移除文件,可以使用 git rm 命令:

git rm README.md

移除文件后,只需使用默认消息提交:

git commit
[buddy-2 2ae08c4] Merge branch 'buddy-2' into buddy-1

$ git show | head
# commit cf867c41f29d5b672d6d46d77b39b3708e53e0a4
# Merge: 211261b fe6230c
# Author: bylek 
# Date: Wed Sep 23 12:40:51 2015 +0200

# Merge branch 'buddy-1' into buddy-2
>
# Conflicts:
# README.md