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

理解意外提交和未完成提交的分支上的git问题

  •  2
  • Clauds  · 技术社区  · 7 年前

    我们有一些问题与一个分支机构,它在过去不知何故搞砸了。。。以下情况:

    • D是一个交付分支,我们从供应商那里收到更改
    • M是主分支
    • F是特征分支
    • 来自D的提交合并到M
    • M包含F(F2)的意外提交,M3是该提交的还原
                 D
        D1-D2-D3-o
         \      \___________
          \                 \  M
           \-M1-M2-D2-F2-M3-D3-o
            \        /
             \      /    F
              \-F1-F2-F3-o
    

        
                 D
        D1-D2-D3-o
         \      \___________
          \                 \  M
           \-M1-M2-D2-F2-M3-D3-o
                             \
                              \        F
                               \-F1-F3-o
    

    在分支F中,我们仅使用:

    git pull --rebase origin master
    

    有没有解释为什么将F1-F2-F3重定位到F2-M3上会使F2松动?

    我试着用rebase交互模式重写M的历史,并保留合并。。。我的想法是删除意外提交(F2)和它的还原(M3),但结果并没有给我任何信心,我没有失去任何东西。

    https://git-scm.com/docs/git-rebase

    由--preserve merges--interactive提供的待办事项列表没有 重写提交消息应该可以正常工作,但尝试 重新排序提交往往会产生违反直觉的结果。

    1 回复  |  直到 7 年前
        1
  •  2
  •   zigarn    7 年前

    我会猜到的 F2 在…上 M 在…上 F

    F 但不在 M 在两个分支中,它都没有选择它。

    如果您想保留它,一个解决方案是使用 git rebase

    git rebase --onto M $(git merge-base F M) F
    # equivalent to:
    # git rebase --onto M D1 F
    

    F ,但不是在 ( D1 )==> F1-F2-F3 在…的结尾 M


    另一个解决方案是进行交互式重新设置基础( git rebase --interactive M F ),然后显式添加 pick F2

    pick F1
    pick F2
    pick F3