代码之家  ›  专栏  ›  技术社区  ›  joelostblom

如何在合并分支之前将提交移回历史记录中的某个位置,同时保持分支的完整性?

  •  0
  • joelostblom  · 技术社区  · 5 年前

    将分支合并为master之后, 我意识到我理想中应该做出一个小小的承诺 在分支机构合并之前, 因为它与合并前的提交直接相关。 我试着澄清期望的结果是什么 在下面的简化示例中, 哪里

    • C是与合并内容相关的提交,
    • D不涉及任何新合并的内容,并且与A直接相关。

    A----B-C-D
        /
     X-Y
    

    期望的结果是在A之后移动D, 当剩下的部分保持原样时:

    A-D----B-C
          /
       X-Y
    

    在选择所有提交并在A:之后移动D之后重新定位:

    A-D-X-Y-B-C
    

    放下X和Y后重新定位,在A后移动D:

    A-D-B-C
    

    我怎样才能在我的历史中保留这根树枝? 我看过樱桃采摘, 但我不确定我将如何利用它来达到预期的结果。

    树枝不是主人的, 它添加了几个新文件 同时保留他们以前回购的提交历史。 这是本地回购

    1 回复  |  直到 5 年前
        1
  •  1
  •   joelostblom    5 年前

    你可能想这样做:

    git rebase -i --rebase-merges A
    

    rebase todo指令最初如下所示

    label onto
    
    # Branch branch-name/master
    reset [new root]
    pick X
    pick Y
    label branch-name/master
    
    reset onto
    merge -C pick B
    pick C
    pick D
    

    重新排列底部零件,如在标准钢筋基础中:

    reset onto
    pick D
    merge -C pick B
    pick C
    

    --rebase-merges ,您将要求Git尝试重新创建任何现有分支,并在发生rebase时维护合并结构。

    man pages :

    默认情况下,rebase只会从 分支。与 --重新定位合并 ,rebase将尝试 通过重新创建合并提交来重新定位。任何已解决的合并冲突 或者这些合并提交中的手动修改必须是 手动解决/重新应用。

    由 违约,或 no-rebase-cousins 没有 <upstream> 作为直系祖先 排除在外 git-log 2 --ancestry-path 选项将保留其原始祖先 默认情况下。如果 rebase-cousins 模式已打开,例如 提交改为重新定位到 <上游> (或 <onto> ,如果指定)。

    --重新定位合并 在精神上 --preserve-merges ,但在 随意重新排序、插入和删除。

    使用 recursive 合并策略; 不同的合并策略只能通过显式 exec git merge -s <strategy> [...] 命令。

    参见相关StackOverflow主题 here .

        2
  •  2
  •   eftshift0    5 年前

    我不知道只要一次 git rebase -i . 但你可以这样做:

    git checkout A
    git cherry-pick D
    git merge Y # this will create kind-of a B', it won't be the same, though cause you brought D before it
    git cherry-pick C
    

    如果你喜欢这样的结果,你可以考虑移动树枝:

    git branch -f master
    git checkout master