修改使用合并来使用回扣的git主题分支的历史记录

修改使用合并来使用回扣的git主题分支的历史记录,git,git-merge,git-rebase,Git,Git Merge,Git Rebase,我们的git开发工作流程是,主题分支不断地在最新的主文档上重新设置,直到它们被合并 然而,一个新的开发人员创建了主题分支,他在其中多次将master合并到他的主题分支中,以使它们保持最新 A---B---C---D---E topic / / / F---G---H---I master 虽然将这个主题分支合并到master是完全正确的,但它会导致非常混乱的历史。我想将这些主题分支转换为一个干净的线性重基历史记录,该历史记录可以通过一个--no ff合并提交干

我们的git开发工作流程是,主题分支不断地在最新的主文档上重新设置,直到它们被合并

然而,一个新的开发人员创建了主题分支,他在其中多次将master合并到他的主题分支中,以使它们保持最新

    A---B---C---D---E topic
   /       /   /
  F---G---H---I master
虽然将这个主题分支合并到master是完全正确的,但它会导致非常混乱的历史。我想将这些主题分支转换为一个干净的线性重基历史记录,该历史记录可以通过一个
--no ff
合并提交干净地合并到主历史记录中,即:

                A'---B'---E' topic
               /
  F---G---H---I master
理想情况下,会有一些git-fu允许我执行重基,使主题分支上的提交保持原样,同时自动应用主题合并提交(如C和D)中已有的合并冲突解决信息

我知道我可以简单地应用“git diff master..topic”补丁,然后使用rebase向后工作,并手动将单个补丁拆分为单个提交,但是有更简单、更优雅的方法吗


我尝试了直接的
git-rebase
git-rebase-p
命令,但运气不好。

我发现下面的过程似乎工作得相当好,但并不完美。可能需要一些较小的冲突解决方案——见下文

  • 如果尚未完成,则通过从主控形状执行最终合并,确保主题分支与最新主控形状是最新的:

    git checkout topic
    git merge master
    
  • 通过排除合并简化主题分支的历史记录:

    git log --no-merges
    
  • 从上面的日志中,确定分支点(第一个主题分支提交之前的主节点提交,应该是commit F)

  • 将主题分支重新设置到master上,忽略合并(这是默认设置,即不使用
    --preserve merges
    /
    -p
    选项),解决任何冲突

    git checkout master
    git rebase --onto HEAD F topic
    
    我发现在重定基址期间,冲突通常会导致文件处于冲突的“均已修改”状态,但它不包含冲突标记,因此简单的
    git add
    git rebase--continue
    就足以解决冲突并继续。我相信git使用了之前的解决方案来解决冲突

    git checkout master
    git rebase --onto HEAD F topic
    
    此外,在一些更复杂的分支中,将需要多个
    git-rebase--on-HEAD…
    命令,或者可以使用
    git-cherry-pick
    来选择单个提交。只需完成步骤2中给出的日志,将范围重定到HEAD和/或根据需要选择个人提交

  • 当前标题现在应表示重新设置基础的主题分支。通过检查差异是否导致无输出,验证结果是否与原始主题分支匹配:

    git diff topic..HEAD
    
  • 重新设置主题分支名称的名称标题:

    git checkout -b rebased-topic
    

  • Raman的回答对我来说非常有用,但我想我应该在第4步中添加更多细节,这对我来说很棘手

    我有一份更复杂的回购协议,就像这样

            Q-R-S-T-U-V-W-X
           /   /     /   /
    A-B-C-D-E-F-G-H-I-J-K
    
    我想要这个:

                          Q'-R'-S'-T'-U'-V'-W'-X'
                         /
    A-B-C-D-E-F-G-H-I-J-K
    
    有效的方法是将
    git-rebase——放在头qr
    上,然后
    git-rebase——放在头su
    上,这样基本上就可以获取我将
    master
    合并到
    主题
    中的位置之间的提交范围。在我做这件事的整个过程中,我处于超然的头部状态,所以如果你看到了,不要担心。有几次我有合并冲突,但它们都是我期望看到的合法冲突

    最后,我得到了一个看起来正确的分支(Raman回答中的第6步),但出于某种原因,我不得不再次重新设置到master上,以实际移动提交。我不知道为什么我要这么做,但事情进展顺利


    我认为这样做基本上等同于采摘樱桃,所以这样做可能更简单。

    Hmm,你确定这是你真正想要的吗?S、 图形中的V和X被视为合并提交,因此在所需状态下不应显示为S',V',和X'。除非它们包含了一系列手动解决冲突的方法。