Git(Hub) 三方合并、补丁

3
有没有一种自动合并(interdiff)两个主分支和一个基础分支之间冲突的方法?我试图在补丁级别上实现它。
  • VersionA 是我的基础
  • VersionB 从 VersionA 分支出来
  • VersionB 应用了另一个模块,Base+ModB
  • VersionC 从 VersionA 分支出来
  • VersionC 应用了另一个模块,Base+ModC
手动应用补丁,我可以得到 A:B 和 A:C 补丁,并依次将它们应用于版本 A。但是,如果它们在应用的区域中发生冲突(例如编辑相同的区域),它们就会失败。
我尝试了各种工具,如 interdiff 和 combinediff,手动创建组合补丁,但都没有成功(我在 Windows 上,interdiff 兼容 cygwin,但我不知道 UNC 是否是一个问题,到目前为止我认为不是),指定输出格式为统一格式或上下文格式,由于 interdiff/combinediff 的要求。
那么...有没有办法让 Version A 成为我的基础,而 Version A:B && A:C 的组合变化成为我的 head? 然后进行某种形式的三向 pull request?
如果出现任何冲突,我希望 Git 能够智能地解决它们,通过进行其臭名昭著的 >>>>> 和 ===== 和 <<<<<<<< 合并冲突,这在这一点上完全可以接受。
最终,我想找到一种方法,在补丁级别上通过组合补丁来实现这一点。我看到 Git(hub) 有一些选项用于处理三向补丁和使用 git apply、git patch 和 git format-patch 发送补丁的电子邮件。
这也有所帮助: Git pull gives conflicts with octopus strategy 尽管我没有从远程拉取,但在本地工作时,pull 是合并(命令基本相同)。
1个回答

2
最接近的可能是章鱼合并(合并多个HEAD):
git merge B C

请注意顺序可能很重要:“Git章鱼合并多个分支的顺序”。

OP thistleknot 在评论中补充道:

最初合并失败,直到我意识到我从一个“错误的点”分支出了一个共同的祖先。
直到我查看了 merge*.* 输出文件并发现每个合并文件都是一个源文件。一个来自版本 B,一个来自版本 C,还有一个来自版本 B 和版本 C 的共同祖先。一旦我弄清楚了这一点,我就能做更多的分支操作,然后合并就成功了,并显示了 <<<====


谢谢,有人建议我应该研究一下rebase。我很感激,我会尝试一下并看看效果如何。 - thistleknot
谢谢。最初合并没有成功,直到我意识到我在一个“错误的点”分支了一个共同祖先。我不知道这一点,直到我查看了合并*.*输出文件,并看到每个合并文件都是一个源文件。一个来自版本B,一个来自版本C,以及B和C的共同祖先。一旦我弄清楚了这一点,我就能够进行更多的分支操作,合并就成功了,带有<<<和==== :) - thistleknot
@thistleknot 太好了!我已经将您的评论包含在答案中,以增加其可见性。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接