我目前已经将一个巨大的项目从 SVN 导入到 Git。 我决定将所有分支展平,只保留 2 个。 Master 分支和 Diverged 分支。
Master: A-B-C-D
\ X-Y: Bugfix
Diverged: E-F-G-H
diverged 包含很多不同的源代码,但有些部分仍然来自 master。当我们必须做一些错误修复时,我们必须在 SVN 上手动修补 Master 和 Diverged。我想将 Bugfix merge 到 master 中(这里没问题)并将 Bugfix merge 到 Diverged 中。
请记住,我不希望将之前的提交插入到与 master 的分歧中。所以应该忽略ABCD。 我正在寻找的结构是这样的:
Master: A-B-C-D-X-Y
Diverged: E-F-G-H-X-Y
谁能帮我解决这个问题?
最佳答案
merge 分歧的分支总是很痛苦。
首先,您必须记住一些有用的 git
命令,它们将帮助您进行怪物 merge 。
git log HEAD..origin/master
- 将显示分支之间的差异。
如果简单的 git merge origin/master
不起作用,请尝试将 merge 拆分为一系列较小的任务。我建议将您的 fork 分支重新定位在当前主分支之上,以便将更改本地化:
git rebase remotes/origin/master
您最终会遇到解决每个冲突(可能在许多提交中)的无聊任务,但这些小任务比一次处理整个 merge 要简单得多。
Master: A-B-C-D-X-Y
Diverged: E-F-G-H-X-Y
git checkout diverged
git rebase master
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/
关于Git:如何 merge 多年来分歧很大的复杂分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12637678/