Git说“自动合并失败”,这是什么意思?

19

我试图合并两个分支,以下是我的操作步骤和结果:

Abdulla (Master) new-git-project1
$ git merge sidebar
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
Abdulla (Master *+|MERGING) new-git-project1
$ git merge sidebar
error: Merging is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and make a commit.
fatal: Exiting because of an unresolved conflict.

我是新手,所以能否得到简单的回答?


6
可能是 如何在 Git 中解决合并冲突? 的重复问题。 - phd
1
手动合并后,通过 git merge --continue 完成合并。来源 - cachius
2个回答

17

你遇到了合并冲突。这意味着 Git 无法自动确定如何合并两个分支。Git 要求你手动合并,并通过告诉你哪些文件它无法自动合并以及在这些文件中具体有哪些更改会出现问题来提供一些帮助。

运行git status。它将输出未合并文件的列表。这些文件将包含类似于以下内容的冲突标记:

foo

<<<<<<< HEAD
BAR
=======
bar baz
>>>>>>> foo

qux
这意味着HEAD(或者你当前所在的提交或分支)将一行改成了BAR,而分支foo也将同一行改成了bar baz
请根据需要编辑每个冲突,确保没有剩余的冲突标记。例如,如果你更喜欢上面例子中的BAR版本,只需编辑文件,使其看起来像这样:
foo

BAR

qux

保存每个文件并随时添加。

# (edit <file>)
git add <file>

有一些可用的工具可以为您完成文件编辑部分,有些人发现使用这些工具比手动编辑文件更容易。

完成后,运行git status以确保没有更多未合并的文件。然后,如果您对结果满意,请运行git commit来完成合并。

Git - Basic Branching and Merging提供了关于合并冲突的更多信息。


另一种不同但通常更明智的方法是,首先将另一个分支(在本例中为sidebar)变基到要将其合并到的分支之上(在本例中为master):

git checkout sidebar
git rebase master

你可能仍然会遇到冲突,但在这里解决它们有时更容易。该过程与上述描述的相同,编辑文件,添加文件,提交。完成后,运行git rebase --continue来继续变基过程。

最后,你可以无冲突地合并分支:

git checkout master
git merge --no-ff sidebar

--no-ff 是可选的;使用它将得到一个合并提交以表示您合并了一个分支,而不使用它则会使您的历史线性而没有合并提交。

在合并之前进行变基的好处是在实际合并中永远不会有合并冲突,这意味着合并提交除了已经由被合并的分支中的提交引入的内容之外,永远不会引入其他更改。 这使得历史更易理解。

变基的缺点是提交被应用在代码的新状态之上。 这意味着您需要检查每个提交以确保它仍然有效。 为避免未来的惊喜,花费一些时间做这件事是一个好主意。

避免或至少在重新定位具有合并的分支时要小心。 变基会删除合并项。 还建议避免对另一个人的提交进行变基。 更改的作者通常是最了解如何妥善解决任何合并冲突的人,因此如果可能,最好委派冲突解决。


1
这条消息意味着两个分支的index.html文件存在不同之处,因此存在合并冲突。您需要使用像meld这样的合并工具来解决这些冲突。在这里,您需要决定在此分支上要保留哪些更改。解决这些冲突后,您需要提交本地更改,然后将其推送到远程git存储库。您可以参考下面的链接来解决冲突。 https://help.github.com/articles/resolving-a-merge-conflict-using-the-command-line/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接