由樱桃选择产生的Git冲突

时间:2013-12-11 22:20:53

标签: git merge git-merge git-cherry-pick

首先,我是git的新手,但一直在吃documentation以及thisthis等主题的类似问题(稍后我会提到后一个问题)在帖子中)。

摘要:我正在挑选从一个分支到另一个分支的提交,在对一个分支进行提交然后尝试将它们合并回来之后,我收到了冲突。请参阅下面的答案,了解我的想法。

场景:我有两个文件,一个在“主”分支上,另一个在“辅助”分支上。 “辅助”分支包含一些我们不想在master中使用的文件,仅供少数人使用,但我们在“master”和“secondary”中拥有的大多数文件应该是一致的(master中的所有文件都是在辅助中,但辅助中的所有内容都不在主人中)。为实现这一目标,我一直在提交“master”中的更改,使用git checkout secondary签出我的“辅助”分支,然后运行git merge master。不幸的是,我曾经发生了一次冲突,现在我的大脑正在试图找出冲突是什么。

尝试解决方案:首先,我认为这是因为我修改了“二级”和“大师”中的文件,我有。为了解决这个问题,我使用git cherry-pick [commit]将我在辅助分支中所做的更改提取到主分支中。但是,我仍然无法将我的主分支合并到辅助分支。 Git建议使用git add/rm(大概是git addgit rm,虽然这让我有点想弄清楚)来标记我想要的那些。所以我使用git rm command删除了“secondary”中的索引和工作树中的版本。在此之后,我回到我的“主”分支,重新将我想要合并的文件合并到“辅助”,然后返回“辅助”,然后再次运行git merge master。令我懊恼的是,冲突。

问题:坦率地说,我想我不知道发生了什么。我认为git merge master(当在辅助分支上运行时)将在git主提交中进行所有更改并将这些更改放在辅助分支中。如果发生了这种情况,我不明白这个问题。我已从辅助文件中删除了文件,并已在master中提交了我的更改。为什么我不能合并?我前面提到的后一个问题的解决方案表明它可能是因为共同的祖先包含其他东西,但我认为git cherry-pick [commit]会照顾到这一点。问题是cherry-pick没有创建新的合并库,所以即使有问题的文件在cherry-pick之后是相同的,它们可能仍然与它们的合并库不同吗?

我为这个问题的长度道歉,我正在努力去理解,并且觉得我在圈子里跑。任何建议都会很棒。

编辑:我想我也很困惑,因为我不明白为什么git不会让我改变分支来尝试解决这个问题。当我尝试git checkout secondary现在尝试并且可能cherry-pick提交更改为次要时,我得到error: you need to resolve your current index first。我认为必须有一个原因git不允许这种行为,我只是不确定我看到它是什么。

2 个答案:

答案 0 :(得分:1)

最后一点 - 你的回购处于不稳定状态。您可以手动编辑冲突,complete the merge commitback out of it

我认为master上的一个或多个提交包含仅存在于master上的文件。 Git无法合并这些提交,因为它们包含对不存在的文件的更改。

尝试'git status'以查看您目前的位置;寻找'两个修改'的文件。然后'git rm'将文件从合并中取出,或者您可以解决文件中的问题(冲突)并使用'git add'将它们添加回提交。然后'git commit'完成合并。

答案 1 :(得分:0)

找到解决方案!发生的事情是cherry-pick创建一个新的合并库(因此它们共享一个共同的祖先,但它与它们当前的两个状态都不同)。因此,当我在cherry-pick之后修改master时,我的所有三个文件都不同。想象:

共同祖先: File.txt: this is the common ancestor.

然后我在辅助分支上进行更改,并提交它们。

<强>次要的: File.txt: now I've modified this file to be this!

然后我git checkout mastergit cherry-pick [commit made on secondary]

File.txt: now I've modified this file to be this!

但是,共同的祖先仍然是File.txt: this is the common ancestor.如果我对master进行提交,将其更改为File.txt: now this is the new master!,我会有三个不同版本的File.txt!因此,当我尝试合并时,git抱怨冲突,因为它不确定如何组合这两个不同的文件。要解决此问题,只需在主人git merge secondary之后直接运行cherry-pick 即可!所以如果我们现在合并,我们得到:

共同祖先: File.txt: now I've modified this file to be this!

这似乎不直观,因为master和secondary之间的合并实际上并没有对他们的文件做任何事情,因为它们在这一点上是相同的。但是,在我们对任一分支进行更改之前,必须执行此合并以创建共同的祖先。希望这有助于某人!