3

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

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

Diverged: E-F-G-H

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

请记住,我不希望将以前的提交插入到来自 master 的 Diverged 中。所以 ABCD 应该被忽略。我正在寻找的结构是这样的:

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

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

谁能帮我解决这个问题?

4

2 回答 2

2

合并分歧的分支总是很痛苦的。

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

git log HEAD..origin/master- 将向您展示分支之间的差异。

如果简单git merge origin/master不起作用,请尝试将合并拆分为一系列较小的任务。我建议将您的分歧分支重新设置在当前 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 快进到分支的尖端:

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/

于 2012-09-28T10:58:30.373 回答
1

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

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

git checkout diverged
git cherry-pick X Y

这正是您在示例中描述的情况,但实际上并没有合并任何东西。

于 2012-09-28T14:37:39.770 回答