通过意外和撤消提交了解分支上的rebase的git问题

时间:2017-08-24 13:42:22

标签: git rebase git-rebase

我们在某个分支中遇到了一些问题,这些问题在过去以某种方式搞砸了......以下情况:

  • D是我们从提供商处收到更改的交付分支
  • M是主分支
  • F是功能分支
  • 来自D的
  • 提交合并到M
  • F用M
  • 重新定位
  • M包含意外提交F(F2),M3是该提交的还原
             D
    D1-D2-D3-o
     \      \___________
      \                 \  M
       \-M1-M2-D2-F2-M3-D3-o
        \        /
         \      /    F
          \-F1-F2-F3-o

现在我们再次尝试使用M来修改F,但最终我们用M3恢复的更改F2。

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

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

{{1}}

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

似乎工作的是将F中的所有更改压缩到单个提交然后执行rebase,在这种情况下,F2中引入的更改仍然存在。

我尝试使用rebase交互模式重写M的历史并保留合并...我的想法是删除意外提交(F2)和它的恢复(M3),但结果并没有让我有信心,我没有放松任何东西。

我也遇到了以下内容(在这里提到的错误:https://git-scm.com/docs/git-rebase),这让我放弃了重写大师历史的想法。

  

--preserve-merges --interactive提供的待办事项列表没有   表示修订图的拓扑。编辑提交和   重写他们的提交消息应该工作正常,但尝试   重新提交提交往往会产生违反直觉的结果。

1 个答案:

答案 0 :(得分:2)

我猜我F2 M F2 F F M上的F2,而不是图表所示的合并。

当重新定位时,git会挑选git rebase但不在git rebase --onto M $(git merge-base F M) F # equivalent to: # git rebase --onto M D1 F 中的所有提交,因为F在两个分支中都没有选择它。

如果你想保留它,解决方案是使用M

的所有参数
F

这将重新定位D1中的所有提交,但不会改为F1-F2-F3Mgit rebase --interactive M F)==>的共同祖先。 pick F2pick F1 pick F2 pick F3

另一种解决方案是进行交互式变基(tf.estimator.Estimator),然后在rebase-todo中明确添加element.attribute("attribute name")

element.get_attribute("attribute name")