将上游更改合并回我的分支时出现问题

54

我在将上游更改合并回我的分支时遇到了冲突,不知道如何解决。

我创建了自己的分支。我克隆了它。我对我的分支进行了更改,提交并推送。但是然后主分支进行了更新,我尝试通过以下方式合并上游来更新自己的分支:

$ cd repo-name
$ git remote add upstream git://github.com/username/repo-name.git
$ git fetch upstream
$ git merge upstream/master
合并操作提示有一个文件存在问题,自动合并无法完成,建议手动修复后再次合并。于是我去了(上游)GitHub存储库获取了最新文件的所有代码,并将其复制到我的派生分支中相应的文件中,然后尝试再次合并。但是此时Git给出了以下错误提示:
致命错误:由于你有未合并的文件,“合并”不可能完成。 请在工作树中修复它们,然后使用“git add / rm ”适当地标记解析并进行提交,或使用“git commit -a”。 我是否漏掉了一些参数?我是否做了什么愚蠢的事情?什么是“未合并的文件”?难道合并的整个目的不就是合并文件吗?我必须在合并之前提交我的更改吗?

1
诚恳的建议:我建议您阅读有关版本控制系统和合并的教程。您提出的问题和回答让我非常担心您是否能够正确理解它们。 - sehe
1
如何解决冲突:http://www.kernel.org/pub/software/scm/git/docs/git-merge.html#_how_to_resolve_conflicts - Josh Lee
1
ProGit似乎是一本关于Git的相当受欢迎的在线书籍;我还推荐从下而上学习Git。 - alternative
5个回答

44

你所看到的意味着自动合并无法解决文件中的冲突。你需要手动解决这些冲突。运行 git mergetoolgit gui


1
好的,刚刚运行了Git GUI。我以前从未使用过它,当我打开我的本地代码库后,运行了Git GUI之后该怎么做? - anonymous
3
好的,我更喜欢使用合并工具。那么它会显示每个冲突,它会自动修复冲突吗?你可以改变它如何修复吗?还是我仍然需要手动修复它? - anonymous
@anonymous Mergetool只是运行您选择的程序,其行为取决于该程序。 - Šimon Tóth
当我运行mergetool时,它告诉我按<return>键打开“合并决策工具”(tortoisemerge)。然后我打开tortoisemerge并查看所有的差异。它会自动为我合并它们吗? - anonymous
运行 git mergetool... 然后呢?这有点吓人。 - Morkrom
显示剩余6条评论

12

"git merge" 命令尝试将另一个分支的更改合并到当前分支。如果合并是干净的,也就是没有冲突,那么它会被提交。由于您的合并存在冲突,因此它没有被提交。您需要解决这个冲突。

从上游存储库拉取副本是解决冲突的一种方法 - 通过接受上游存储库版本。您可以在git中使用 "git checkout --theirs conflicting_file.txt" 来执行此操作。

编辑文件以使其达到您想要的形式是另一种方法。

一旦修复完成,您需要使用 "git add conflicting_file.txt" 添加文件,然后进行提交。然后您的工作副本就变得干净并且准备好继续开发。祝你好运。


好的,(我正在开发的项目使用Java),所以如果冲突的文件叫做"blah.java",我应该运行"git checkout --theirs blah.java"对吧? 我不理解整个“add”的意思。如果我已经解决了冲突,为什么还需要“add”呢? - anonymous
1
这就像在git中进行任何编辑一样。首先在您的工作副本中编辑文件。然后添加(git add blah.java),这告诉git该文件(blah.java)将成为下一个提交的一部分。然后实际执行提交。与合并的区别在于,一些文件,那些没有冲突的文件,已经被添加了。您需要添加其余的文件以显示您已解决冲突。 - cbare

9
在Git中,有些情况下合并会拒绝开始,以保护您的本地更改。这种情况可能发生在以下两种情况下:
您的代码库里有未提交的更改与合并冲突。Git会拒绝进行合并并显示以下信息:
错误:您本地的以下文件更改将被合并覆盖: foo 请先提交更改或使用"git stash save"保存后再进行合并。
因此,您需要先提交更改("git commit -a"或者"git add" + "git commit"),或通过使用"git stash save"来储藏更改。
您处于某个未完成的合并操作的中间阶段。例如,在某些文件中发生了冲突,并且您尚未完成解决冲突(通过编辑文件并使用“git add”标记为已解决,或使用“git mergetool”使用一些图形化合并工具),也没有使用“git commit -a”创建最终合并提交,或使用“git reset --hard”中止了合并(注意:这将丢弃所有更改,您将损失解决冲突的工作!!!)。
或者,您刚刚运行了第二个“git merge”,或者使用了“git merge”而不是“git commit”来创建合并提交。
请按照例如Junio C Hamano在旧文章“Fun with completing a merge”中所述解决冲突并使用“git commit”完成合并,或放弃合并,或将其存储起来。然后,如果您想要创建这个第二个合并提交,请执行此操作。

注意:默认情况下,git-aware shell提示会显示您是否处于合并、变基或应用补丁(git am操作)的过程中。您还可以配置它以显示工作目录是否脏(不同于最新版本,即HEAD)。


3

在添加文件之后,第二次运行git commit,而不是git merge

此外,冲突解决会创建文件来帮助您合并。请参见git mergetool


好的,但是当我运行 git commit 命令时,会得到一个类似的错误提示:"无法提交未合并的文件"。 - anonymous
你先运行了 git add <file> 吗? - alternative
没有,我运行了git mergetool并解决了问题,然后提交了。我应该做些什么不同的事情吗? - anonymous
如果您手动解决而不使用git mergetool,则必须先使用git add。但是使用git mergetool是最好的选择。 - alternative

2
在解决合并问题后,您需要使用git add将更改的文件添加到索引中,然后提交(如消息所示)。这会告诉git:“是的,我真的想要进行这些更改”。
请记住,在提交之前(无论是正常提交还是合并提交),如果您正在使用命令行界面,请始终使用git add。像magit这样的前端可以为您简化此过程,因此您不必担心每次输入“git add”。

好的,我猜那很有道理。只需要“git add”吗?还是“git add -a”可以工作?:P 不行,我必须手动添加每个更改过的文件吗? - anonymous

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