【问题标题】:Git conflicts generated by cherry-picks樱桃挑选产生的 Git 冲突
【发布时间】:2013-12-30 03:13:32
【问题描述】:

首先,我是 git 新手,但一直在吃 documentation 和类似主题的类似问题,如 thisthis(我将在后面的帖子中提到后一个问题)。

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    最后一点-您的回购处于不确定状态。您可以手动编辑冲突和complete the merge commit 或者您可以back out of it

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

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

    【讨论】:

    • 谢谢!我认为这让我开始了,但我仍然很困惑为什么首先会出现问题。所以我将一些文件提交到辅助分支,然后将提交的内容精选到 master 中。然后我在 master 上修改了这些文件,当我尝试在 master 上提交,然后合并回辅助文件时,我遇到了冲突。我很困惑,因为在挑选樱桃之后,我的文件完全一样,所以我不明白怎么会发生冲突。在这里存在冲突是否有意义,还是我错过了什么?
    【解决方案2】:

    找到了解决方案!正在发生的事情是 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 抱怨冲突,因为它不确定如何合并两个不同的文件。要解决这个问题,只需在 master 上运行 cherry-pick 之后 直接 运行 git merge secondary!所以如果我们现在做这个合并,我们会得到:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-16
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多