1

如何将某个功能的某些提交从现有分支移动到功能分支中,并有效地将它们从当前分支中删除 - 就好像该功能是在单独的功能分支中开发的一样?

背景:分支develop包含对两个功能 A(例如 50 次提交)和 B(10 次提交)的提交,因为它们原本应该在同一个版本中。现在我们正在延迟特征 B。因此,我们希望分支中只有特征 A develop,以及一个包含 A 或 A 和 B 的提交的新featureB分支,这样如果我们合并两个分支,我们就会得到当前位置develop分支。

一种方法是featureB从分支的当前位置创建develop分支,然后将提交从 A 反向应用到develop. develop但随后新的合并featureB将只是 A。

另一种方法是将当前重命名developfeatureB并将 A 的所有提交选择为新develop分支。但这会有效地修改 的历史develop,这很麻烦。

有什么更好的方法来做到这一点?

4

4 回答 4

2

到目前为止,如果您可以管理它,最干净的方法就是编写正确的历史记录并切换参考。调用您要拆分的历史记录的基础X

git checkout -b new-develop X
git cherry-pick [all the feature_A commits]
# repeat the cherry-pick as needed or convenient if there's too many 
git checkout -b new-featureB X
git cherry-pick [all the feature_B commits]
# ...

git branch -m然后用、force-push 交换名称,并让每个人根据需要重新获取和重新定位任何未发布的作品。

所有其他选择都会给你留下一段非常混乱的历史,如果完全可以避免它,就没有理由把它强加给所有后代。 如果出于任何原因沟通出现问题,请避免使用它

如果您真的做不到,请查看@MykolaGurov 的详细回答


branch→... checkout -b

于 2015-03-30T23:40:36.243 回答
2

如果您的分支develop已发布并且您不想重写其历史记录(这将是最简单的方法),那么您确实可以恢复您的更改develop,在. 沿线的东西:featureBBdevelop

 #given history (top - newest)
 #shaA3 <-- develop, HEAD
 #shaB2
 #shaA2
 #shaB1
 #shaA1

恢复:

 git revert B2
 git revert B1

现在历史包含:

 #revert of shaB1 <-- develop, HEAD
 #revert of shaB2
 #shaA3
 #shaB2
 #shaA2
 #shaB1
 #shaA1

重新创建featureB并重新播放还原的提交:

 git checkout -b featureB
 git rebase -i --onto develop shaB1~1 featureB

注释掉所有提交,除了那些属于功能 B 的提交(在我们的例子中)shaB1shaB2完成变基。在这一点上,你应该有历史:

 #shaB2' <-- featureB, HEAD
 #shaB1'
 #revert of shaB1 <-- develop
 #revert of shaB2
 #shaA3
 #shaB2
 #shaA2
 #shaB1
 #shaA1

要仔细检查一切是否顺利,您可以做git diff shaA3- 应该为空,git diff develop- 应该包含所有所需的 B 更改。

PS您当然可以使用cherry-pick或revert of reverts将b更改重播为branchB,而不是rebase交互,例如在开发时:

 git checkout -b branchB
 git revert <revert of shaB1>
 git revert <revert of shaB2>

会给你:

 #revert of revert of shaB2 = shaB2' <-- featureB, HEAD
 #revert of revert of shaB1 = shaB1'
 #revert of shaB1 <-- develop
 #revert of shaB2
 #shaA3
 #shaB2
 #shaA2
 #shaB1
 #shaA1
于 2015-03-30T21:10:07.813 回答
0

featureB从当前的开发状态创建分支。将代码提交到分支develop以进一步开发 featureA。将代码提交到分支featureB以开发 featureB。featureB定期对分支进行rebase 分支,develop以便它具有为开发 featureA 而添加的更改。

于 2015-03-30T16:10:47.983 回答
0

如果您想避免修改已发布的分支历史记录develop,如@thill 的回答,并且还想避免恢复已恢复的提交,如@Mykola Gorov 的回答,您还可以

  1. featureB从创建分支develop
  2. 将 feature 的提交恢复B到 branch develop。在一次提交中执行此操作可能是明智的revert B,因为这是历史上的一项操作。
  3. 与策略develop合并分支。这不会更改 branch 中的任何文件,但会将从 2. 恢复的提交标记为已合并到. 因此,如果您稍后将功能分支合并回,结果将不再包含提交。featureBoursfeatureBfeatureBfeatureBdeveloprevert B

featureB重新合并时develop,您可能希望featureB作为提交的第一个父级。(例如,您合并developfeatureB然后设置developfeatureB,而不是相反。)我想这种方式的回归不会再混淆责备等。(?)

于 2015-04-14T13:33:55.773 回答