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

时间:2012-09-28 09:52:17

标签: git svn branch git-merge git-rebase

我目前已经从SVN向Git导入了一个庞大的项目。 我决定将所有分支扁平化,只保留2个。 主分支和分支分支。

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

Diverged: E-F-G-H

分歧包含许多不同的源代码,但有些部分仍然来自master。当我们必须做一些错误修正时,我们必须在SVN上手动修补Master和Diverged。我想将Bugfix合并到master中(这里没问题)并将Bugfix合并到Diverged。

请记住,我不希望以前的提交从主人插入Diverged。所以ABCD应该被忽略。 我正在寻找的结构是:

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

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

有人能帮我解决这个问题吗?

2 个答案:

答案 0 :(得分: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

将省略空提交。 在最复杂的场景中,您可以在分支上使用交互式rebase来重新排列提交。即,对于你的计划:

虽然这是手工作业,但它仍然是一种分而治之的策略。

阅读这篇文章,了解一些深入的想法:http://blog.springsource.org/2010/12/21/git-and-social-coding-how-to-merge-without-fear/

答案 1 :(得分:1)

您的示例可以通过git cherry-pick轻松解决(除了合并冲突)。

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

git checkout diverged
git cherry-pick X Y

这确实创建了您在示例中描述的情况,但它实际上并没有合并任何内容。