有时我会处理多个部分的特征,因为它是一个很大的特征,但每个部分都依赖于之前的部分。
我将从第一部分分支第二部分,而第一部分仍在审核/测试/等等。我最终得到类似的东西 -
---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
。所以我最终得到F1
和F1'
的“双重提交”。
在重新定位时,基本上替换 F1
与F1'
有什么办法吗?
更一般地说 - 关于如何使用涉及多层分支的功能的最佳实践是什么?我通常永远不会超过2,但如果有一个很好的工作流程来管理它,我就会使用它。
答案 0 :(得分:1)
您可以通过B2中的交互式rebase来完成此操作。
$ git checkout B2
$ git rebase -i B1
然后只需删除F1的行,只保留F1的行,你得到了你想要的东西,切换彼此的提交:)
我将Fi用于提交,B用于分支。显然,rebase是在它打开的编辑器中的每次提交,如果我们在讨论功能分支中的一个或多个提交,我就不会抓住它。
答案 1 :(得分:1)
另一种选择:
git checkout F2
git rebase --onto F1 "$(git merge-base --fork-point F1)"
答案 2 :(得分: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
在杂草中看起来很深,但这是一个非常常见的序列。这里的rebase命令是
git rebase
当您重新定位到默认跟踪分支时,Rebase默认为--fork-point
,当您没有(必要)F2检出并且F2不跟踪F1时为git rebase --fork-point F1 F2
。