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

标签 git svn branch git-merge git-rebase

我目前已经将一个巨大的项目从 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/

相关文章:

git - 我可以在 Git 中删除分支后恢复它吗?

git - 切换 git 分支时如何处理 vim 缓冲区?

git - 将参数传递给 git post-receive Hook

Git move n 向前提交

eclipse - 我是否需要将 .groovy 和 .settings 文件夹提交到存储库

java - 如何最好地在 EAR 中存储 Subversion 版本信息?

git - 没有 git 树,为什么?

android - 从 android studio 推送后更改提交消息

git - 为什么我收到错误 "fatal: ' C :/Program Files (x86)/Git' is outside the repository"when I run "git reset --hard ~1" from within the repository?

svn - 在 SVN 中存储二进制文件是否可以接受/很好?