【问题标题】:Git: How to merge complex branches that have diverged a lot over the yearsGit:如何合并多年来分歧很大的复杂分支
【发布时间】:2012-09-20 04:49:26
【问题描述】:

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

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

Diverged: E-F-G-H

diverged包含很多不同的源代码,但有些部分仍然来自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

谁能帮我解决这个问题?

【问题讨论】:

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


    【解决方案1】:

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

    首先,您必须记住一些有用的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/

    【讨论】:

      【解决方案2】:

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

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

      git checkout diverged
      git cherry-pick X Y
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-27
        • 2021-12-05
        • 2012-02-06
        • 1970-01-01
        • 2012-06-21
        • 2013-12-27
        • 1970-01-01
        相关资源
        最近更新 更多