无法将上游更改合并回我的分支
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 mergetool
或git gui
。
【讨论】:
好的,刚刚运行了 Git GUI。我之前和打开本地存储库时从未使用过它。运行 git GUI 后我该怎么办? 在git gui
你会看到冲突的文件。您可以直接从git gui
检查和解决它们。或者,如果您不喜欢 git gui
,只需运行 mergetool
即可解决冲突。
好的,我更喜欢mergetool。所以它向我展示了每个冲突,它会自动修复冲突吗?你能改变它的修复方式吗?还是我还需要手动修复?
@anonymous Mergetool 只是运行您选择的程序,行为取决于程序。
当我运行 mergetool 它告诉我点击 “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 -a
或git 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
来创建合并提交。
如前所述解决冲突,例如在 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 不,没有工作。我必须手动添加每个更改的文件?以上是关于无法将上游更改合并回我的分支的主要内容,如果未能解决你的问题,请参考以下文章