无法将上游更改合并回我的分支

Posted

技术标签:

【中文标题】无法将上游更改合并回我的分支【英文标题】:Trouble merging upstream changes back into my branch 【发布时间】:2011-08-11 23:43:59 【问题描述】:

我在尝试将上游更改合并回我的分支时遇到了冲突,我不确定如何解决它们。

我创建了自己的分叉。我克隆了它。我对我的 fork 上的分支进行了更改、提交和推送。但是随后主分支更新了,我尝试通过像这样合并上游来更新我自己的分支:

$ cd repo-name
$ git remote add upstream git://github.com/username/repo-name.git
$ git fetch upstream
$ git merge upstream/master

合并表示文件存在问题,自动合并不起作用。它告诉我自己修复它并重新合并。所以我实际上去了主fork的GitHub上的(上游)存储库,并将新文件的所有代码复制到我的fork上的文件中,并再次尝试合并。然后,git给了我这个错误:

致命:“合并”是不可能的,因为您有未合并的文件。 请在工作树中修复它们,然后使用 'git add/rm' 作为 适合标记解决方案并进行提交,或使用 'git commit -a'。

有什么我要忽略的论点吗?我在做傻事吗? “未合并的文件”是什么意思?合并的重点不是合并文件吗?我必须在合并之前提交更改吗?

【问题讨论】:

诚实的建议:我建议您阅读有关 VCS 和一般合并的教程。你给的问题和回答让我有点担心你是否能做对 如何解决冲突:kernel.org/pub/software/scm/git/docs/… ProGit 似乎是一本非常流行的 Git 在线书籍;我也会自下而上推荐 Git。 【参考方案1】:

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

【讨论】:

好的,刚刚运行了 Git GUI。我之前和打开本地存储库时从未使用过它。运行 git GUI 后我该怎么办? git gui 你会看到冲突的文件。您可以直接从git gui 检查和解决它们。或者,如果您不喜欢 git gui,只需运行 mergetool 即可解决冲突。 好的,我更喜欢mergetool。所以它向我展示了每个冲突,它会自动修复冲突吗?你能改变它的修复方式吗?还是我还需要手动修复? @anonymous Mergetool 只是运行您选择的程序,行为取决于程序。 当我运行 mergetool 它告诉我点击 打开“合并解析工具”(tortoisemerge)然后我打开 tortoisemerge 并查看所有差异。它会自动为我合并它们吗?【参考方案2】:

“git merge”命令尝试将来自另一个分支的更改合并到当前分支。如果合并是干净的,意味着没有冲突,它将提交。由于您的合并确实存在冲突,因此它没有提交。您需要解决冲突。

从上游 repo 中提取副本是一种方法 - 通过接受上游 repo 的版本。您可以在 git 中使用“git checkout --theirs conflicting_file.txt”

编辑文件以使其成为您想要的形状是另一种方式。

一旦修复,您需要使用“git add conflicting_file.txt”添加,然后提交。这样你的工作副本就干净了,可以进行更多的黑客攻击了。祝你好运。

【讨论】:

好的,(我正在处理的项目是Java)所以如果冲突文件被称为“blah.java”我会运行“git checkout --theirs blah.java”?而且我不明白整个“添加”的事情。如果我解决了冲突,为什么还需要“添加”? 这就像 git 中的任何编辑一样。您首先编辑工作副本中的文件。然后添加 (git add blah.java),它告诉 git 文件 (blah.java) 将成为下一次提交的一部分。然后实际执行提交。合并的不同之处在于,一些没有冲突的文件已经被添加了。添加其余文件以表明您已解决冲突。【参考方案3】:

在 Git 中,为了保护您的本地更改,有时合并 拒绝 甚至开始。这可能在两种情况下发生:

您的存储库中有未提交的更改与合并冲突。 git 将拒绝与以下消息进行合并:

错误:您对以下文件的本地更改将被合并覆盖: 富 请在合并之前提交您的更改或存储它们。 中止

然后您必须先提交更改(git commit -agit add + git commit),或者使用git stash save 将它们隐藏起来。

正在进行一些未完成合并操作。例如有一些冲突

自动合并 foo CONFLICT(内容):合并 foo 中的冲突 自动合并失败;修复冲突,然后提交结果。

并且您还没有完成解决冲突(通过编辑文件并使用git add 将它们标记为已解决,或者通过git mergetool 使用一些图形合并工具)并且没有使用git commit -a 创建最终合并提交,或者中止了与git reset --hard 的合并(注意:这将丢弃您所做的所有更改,并且您将失去解决冲突的工作!!!)。

或者你刚刚运行第二个git merge 太快,或者使用git merge 而不是git commit 来创建合并提交。

错误:“合并”是不可能的,因为您有未合并的文件。 提示:在工作树中修复它们, 提示:然后使用 'git add/rm' as 提示:适合标记解决方案并进行提交, 提示:或使用 'git commit -a'。 致命的:由于未解决的冲突而退出。

如前所述解决冲突,例如在 Junio C Hamano 的旧 Fun with completing a merge 文章中并完成与 git commit 的合并,或者丢弃合并,或者将其隐藏起来。然后,如果您打算创建第二个合并,您可以这样做。

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

【讨论】:

【参考方案4】:

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

冲突解决也会创建文件来帮助您合并。另见git mergetool

【讨论】:

好的,但是当我运行 git commit 时,我收到类似的错误“无法提交未合并的文件” 你先运行git add <file>了吗? 不,我运行了 git mergetool 并解决了问题,然后正常提交。我应该做些不同的事情吗? 如果不使用 git mergetool 手动解析,则必须先使用 git add。但是使用 git mergetool 是最好的方法。【参考方案5】:

解决合并后,您需要使用git add 将您更改的文件添加到索引中,然后提交(如消息所述)。这对 git 表示“是的,我真的很想进行这些更改”。

请记住,如果您使用的是命令行界面,请务必在提交之前使用git add(通常或提交合并)。像 magit 这样的前端可以为您简化这一点,因此您不必担心每次都输入“git add”。

【讨论】:

好吧,我想这是有道理的。只需“git add?”或者“git add -a”会起作用吗? :P 不,没有工作。我必须手动添加每个更改的文件?

以上是关于无法将上游更改合并回我的分支的主要内容,如果未能解决你的问题,请参考以下文章

将 master 的更改合并到我的分支中

合并我的分支中只有一个提交包含的更改? [复制]

如何将来自其他分支的未合并上游拉取请求应用到我的分支中?

为什么我的远程主分支中的更改没有被拉到本地主分支中?

使用 Git 将 master 的更改合并到所有分支中?

如何在没有合并提交或使用 CLI 的情况下使 GitHub 分叉保持最新?