首先,我是git的新手,但一直在研究文档和类似的问题,比如这个和这个(我将在后面的文章中提到后一个问题)。
摘要:我从一个分支到另一个分支进行了精心挑选的提交,在一个分支上进行了提交,然后试图将它们重新合并在一起,我收到了冲突。关于我认为发生了什么,请参阅下面的答案。
场景:我有两个文件,一个在"主"分支上,一个位于"辅助"分支上。"辅助"分支包含一些我们不希望在master中使用的文件,并且只供少数人使用,但我们在"master"one_answers"secondary"中的大多数文件都应该一致(master中的所有文件都在secondary中,但secondary中的所有文件都不在master中)。为了实现这一点,我一直在提交在"master"中所做的更改,使用git checkout secondary
签出我的"secondary"分支,然后运行git merge master
。不幸的是,我曾经提出过一个冲突,现在我的大脑在翻腾,试图弄清楚冲突是什么
尝试的解决方案:起初,我认为这是因为我修改了"辅助"one_answers"主"中的文件,我已经修改了。为了解决这个问题,我使用git cherry-pick [commit]
将我在辅助分支中所做的更改拉入主分支。然而,我仍然无法将我的主分支合并到辅助分支中。Git建议使用git add/rm
(可能是git add
或git rm
,尽管我花了一些时间才弄清楚)来标记我想要的。因此,我使用git-rm命令删除了"secondary"中索引和工作树中的版本。在这之后,我返回到我的"主"分支,重新提交我想要合并到"辅助"中的文件,返回"辅助",然后再次运行git merge master
。让我懊恼的是,冲突。
问题:坦率地说,我想我不知道发生了什么。我以为git merge master
(在辅助分支上运行时)会接受git-master提交中所做的所有更改,并将这些更改放在辅助分支中。如果这就是正在发生的事情,我不理解这个问题。我已经从辅助中删除了文件,并在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不允许这种行为肯定是有原因的,我只是不确定我明白它是什么。
最后一点首先-你的回购处于不稳定状态。您可以手动编辑冲突并完成合并提交,也可以退出
我认为master上的一个或多个提交包含了仅存在于master上的文件。Git无法合并这些提交,因为它们包含对不存在的文件的更改。
尝试"git status"查看您当前的位置;查找"both modified"文件。然后使用"git-rm"将文件从合并中取出,或者您可以解决文件内部的问题(冲突),并使用"git-add"将它们添加回提交中。然后"git-commit"完成合并。
找到了解决方案!现在的情况是,cherry-pick
不会创建一个新的合并库(因此它们都有一个共同的祖先,但这与它们当前的状态不同)。因此,当我在cherry-pick
之后修改master时,我的三个文件都不同。可视化:
共同祖先:File.txt: this is the common ancestor.
然后我对二级分支进行更改,并提交它们。
次要:File.txt: now I've modified this file to be this!
然后是CCD_ 19和CCD_。
大师: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抱怨冲突,因为它不确定如何合并这两个不同的文件。要解决此问题,只需在master上的cherry-pick
之后直接运行git merge secondary
即可!因此,如果我们现在进行合并,我们得到:
共同祖先:File.txt: now I've modified this file to be this!
这似乎不直观,因为主文件和辅助文件之间的合并实际上对它们的文件没有任何作用,因为它们在这一点上是相同的。然而,在我们对任何一个分支进行任何更改之前,都有必要进行合并以创建一个共同的祖先。希望这能帮助到别人!