2015-11-04 108 views
0

有时我会在多个部分处理一个功能,因为它是一个很大的功能,但每个部分都依赖于它之前的部分。让第二层分支与第一层保持同步

,而第1部分仍在审核/测试/等我分支的第二部分从第1部分..我结束了类似 - 直到我

  ---F2-> (Feature branch part 2) 
     /
    ---F1------> (Feature branch part 1) 
/
--M0---M1---M2-> (master) 

一切的伟大工程中途功能部件2和实现我需要在功能部分的改变或正确的东西1.

所以我切换回第一个特性分支,并进行了更改(和壁球它,所以它仍然是1提交)

  ---F2-> (Feature branch part 2) 
     /
     ---F1 
    /
    /----F1' (Feature branch part 1) 
/
--M0---M1---M2-> (master) 

当我重新绑定特征部分2分支以拉入F1'时,我解决了所有冲突,但仍然保留F1。所以我最终得到了F1F1'的“双重承诺”。

有没有什么办法可以基本上替换F1F1'当重新绑定?

更一般地说 - 如何使用像这样涉及多层分支的功能的公认最佳实践是什么?我通常不会过去2,但如果有一个好的工作流程来管理它,我会用它。

回答

1

您可以通过B2的交互式转化来完成此操作。

$ git checkout B2 
$ git rebase -i B1 

然后只需删除F1的线,只保留了F1'行了,你得到了你想要的东西,切换提交对彼此:)

我用网络连接的提交(S)和B分支。显然,rebase是在它打开的编辑器中进行的每次提交,并且如果我们正在讨论功能分支中的一个或多个提交,我不太清楚。

+0

非常好,谢谢! – user2490003

1

另一种选择:

git checkout F2 
git rebase --onto F1 "$(git merge-base --fork-point F1)" 
+1

在rebase上还有'--fork-point'选项,'git rebase --fork-point F1 F2'应该这样做。 – jthill

1

的Git使这很容易,只要告诉它你追踪什么。为了制作你的图表,例如这,

git checkout -tb F2   # F2 tracks current checkout (or you could say F1 explicitly) 
work work commit commit 
git checkout F1    # F1 needs work 
work some more 
git rebase     # F1 needs its own rebase 
git checkout F2    # back to F2 
yet more work 

它看起来很杂草,但这是一个非常普遍的序列。从这里底垫命令

git rebase 

再次基于默认为--fork-point,当你的时候你不在(一定)重订到您的默认跟踪分公司,全拼已经F2签出,F2不跟踪F1是git rebase --fork-point F1 F2