0

首先,我是 git 新手,但一直在吃文档类似主题的类似问题我将在帖子后面提到后一个问题)。

摘要:我正在从一个分支到另一个分支中挑选提交,在一个分支上进行提交然后尝试将它们合并在一起之后,我收到了冲突。请参阅下面的答案,了解我认为发生了什么。

场景:我有两个文件,一个在“主”分支上,一个在“辅助”分支上。“secondary”分支包含一些我们在master中不需要的文件,并且只被少数人使用,但是我们在“master”和“secondary”中拥有的大多数文件应该是一致的(master中的所有内容都是在中学,但中学的一切都不是在主人)。为此,我一直在提交在“master”中所做的更改,git checkout secondary用于签出我的“secondary”分支,然后运行git merge master​​. 不幸的是,我曾经提出过一次冲突,现在我的大脑正在搅动,试图弄清楚冲突是什么。

尝试的解决方案:起初,我认为这是因为我修改了“辅助”和“主”中的文件,我有。为了解决这个问题,我git cherry-pick [commit]曾经将在辅助分支中所做的更改拉到主分支中。但是,我仍然无法将我的主分支合并到辅助分支中。Git 建议使用git add/rm(大概是git addor git rm,尽管我花了一点时间才弄清楚)来标记我想要的那些。因此,我使用git rm 命令删除了“辅助”中的索引和工作树中的版本。之后,我回到我的“master”分支,重新提交我想要合并到“secondary”的文件,回到“secondary”,然后git merge master再次运行。令我懊恼的是,冲突。

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

对于这个问题的长度,我深表歉意,我非常努力地理解,并且觉得我在绕圈子。任何建议都会很棒。

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

4

2 回答 2

1

最后一点-您的回购处于不确定状态。您可以手动编辑冲突并完成合并提交,也可以退出它

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

试试 'git status' 看看你现在在哪里;寻找“两个修改过的”文件。然后“git rm”将文件从合并中取出,或者您可以解决文件内部的问题(冲突)并使用“git add”将它们添加回提交。然后 'git commit' 完成合并。

于 2013-12-11T23:38:26.243 回答
0

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

共同祖先: 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 抱怨冲突,因为它不确定如何合并两个不同的文件。要解决这个问题,只需在 master 上的 while 之后git merge secondary 直接运行即可!cherry-pick所以如果我们现在做这个合并,我们得到:

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

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

于 2013-12-13T17:42:06.423 回答