我目前有以下情况(简化)。
master C --+-- E
| | |
hotfix | D --+
| |
develop A - B - C ----- F - G - H - I
|
feature + J - K - L
我想结束:
master C --+-- E ------+
| | | |
hotfix | D --+ |
| | |
develop A - B - C ----- F - G - | --- H - I
|
feature + J - K - L
我将如何以一种体面的 git 方式来做这件事?
feature
中的所有内容都不依赖于 G
,因为在 feature
上编辑的所有内容都位于单独的文件夹中。
我尝试了以下操作(在
feature
时),但所有这些似乎都在F
中的feature
之后留下了提交的痕迹:
1. git rebase --onto master develop feature
2. git rebase --onto E J~1
3. git rebase --onto master develop
从功能中挑选 J、K、L 到主分支上。您将来应该使用良好的分支策略。我正在使用这个one,效果很好。
由于我不能再等待彻底的解决方案,所以我决定使用cherrypick建议。不过,我不想直接在
master
分支上进行挑选,这在我的 git flow 工作流程中是不好的做法。所以我做了以下事情:
启动新的修补程序
$ git flow hotfix start vx.x.x
从
feature
挑选提交
$ git cherry-pick J^..L
完成修补程序,本质上将精选的提交合并到
master
和 develop
$ git flow hotfix finish vx.x.x
确保我永远不会通过在本地删除它们并可能在
feature
上删除来自旧 origin
分支的提交。
$ git branch -d feature
$ git push origin :feature
所以,在此之后,我得到以下结果:
master C --+-- E --+---------- O
| | | | |
hotfix | D --+ J - K - L --+
| | |
develop A - B - C ----- F - G - H - I - M
我仍然相信我应该能够通过 rebase 更优雅地解决这个问题,但我认为这以一种稍微优雅的方式解决了这个问题。
git rebase -i --onto E H L
将 JKL 重新设置为 E