Git:如何合并多年来分歧很大的复杂分支

Git:如何合并多年来分歧很大的复杂分支,git,svn,branch,git-merge,git-rebase,Git,Svn,Branch,Git Merge,Git Rebase,我目前已经将一个巨大的项目从SVN导入Git。 我决定把所有的树枝都展平,只保留两根。 主分支和分叉分支 Master: A-B-C-D \ X-Y: Bugfix Diverged: E-F-G-H 发散的代码包含许多不同的源代码,但有些部分仍然源于master。当我们必须进行一些错误修复时,我们必须手动修补Master并在SVN上进行发散。我想将错误修复合并到master中(这里没有问题),并将错误修复合并到diversed中 请记住,我不希望以前的提交被插

我目前已经将一个巨大的项目从SVN导入Git。 我决定把所有的树枝都展平,只保留两根。 主分支和分叉分支

Master: A-B-C-D
               \ X-Y: Bugfix

Diverged: E-F-G-H
发散的代码包含许多不同的源代码,但有些部分仍然源于master。当我们必须进行一些错误修复时,我们必须手动修补Master并在SVN上进行发散。我想将错误修复合并到master中(这里没有问题),并将错误修复合并到diversed中

请记住,我不希望以前的提交被插入到发散的主文件中。所以ABCD应该被忽略。 我要找的结构是:

Master: A-B-C-D-X-Y

Diverged: E-F-G-H-X-Y

有人能帮我弄清楚吗?

合并分叉的分支总是很痛苦的

首先,您必须记住一些有用的
git
命令,这些命令将帮助您进行怪物合并

git log HEAD..origin/master
-将显示分支之间的差异

如果simple
git merge origin/master
不起作用,请尝试将合并拆分为一系列较小的任务。我建议在当前主节点上重定分支的位置,以便将更改本地化:

git-rebase-remotes/origin/master

您将以解决每一个冲突(可能在许多提交中)的枯燥任务结束,但是这些小任务比同时处理整个合并要简单得多

Master: A-B-C-D-X-Y
Diverged: E-F-G-H-X-Y

git checkout diverged
git rebase master
重定基址完成后,您可以将主节点快进到分支尖端:

Master: A-B-C-D-X-Y
                  \ E-F-G-H
空提交将被忽略。 在最复杂的场景中,您可以在分支上使用交互式重基来重新安排提交。即,对于您的计划:

虽然这是体力劳动,但它仍然是一种分而治之的策略


阅读这篇文章,了解一些深入的想法:

您的示例可以通过以下方法轻松解决(除了合并冲突)

它复制提交,并将其应用于另一个分支

git checkout diverged
git cherry-pick X Y
这恰好创建了您在示例中描述的情况,但实际上并没有合并任何内容