Git:如何合并多年来分叉较多的复杂分支

3

我目前已经将一个巨大的项目从SVN导入到Git中。 我决定扁平化所有分支,只保留两个分支。 主分支和分叉分支。

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

Diverged: E-F-G-H
分支包含了很多不同的源代码,但部分仍然来自主干。当我们需要修复一些漏洞时,我们必须手动在SVN上打补丁,合并Bugfix到主干没有问题,但也需要将其合并到分支中。
请注意,我不希望以前的提交从主干插入到分支中,因此ABCD应该被忽略。我想要这种结构:
Master: A-B-C-D-X-Y

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

有人能帮我弄清楚这个吗?

2个回答

2
合并分歧的分支总是很痛苦的。
首先,您需要记住一些有用的git命令,这将帮助您进行一个巨大的合并。
"git log HEAD..origin/master" - 将显示分支之间的差异。
如果简单的 "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

空提交将被省略。 在最复杂的情况下,您可以使用交互式变基来重新排列提交。即,对于您的方案: 虽然这是手动工作,但仍然是一种分而治之的策略。 阅读此文章以获取一些深入的想法:http://blog.springsource.org/2010/12/21/git-and-social-coding-how-to-merge-without-fear/

1

除了合并冲突之外,您的示例可以轻松地通过git cherry-pick解决。

它会复制一个提交,并将其应用到另一个分支上。

git checkout diverged
git cherry-pick X Y

这会产生你在例子中描述的情况,但实际上并没有合并任何内容。


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