git rebase 具有复杂历史的分支

问题描述 投票:0回答:3

我目前有以下情况(简化)。

   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
git rebase
3个回答
0
投票

从功能中挑选 J、K、L 到主分支上。您将来应该使用良好的分支策略。我正在使用这个one,效果很好。


0
投票

由于我不能再等待彻底的解决方案,所以我决定使用cherrypick建议。不过,我不想直接在

master
分支上进行挑选,这在我的 git flow 工作流程中是不好的做法。所以我做了以下事情:

  1. 启动新的修补程序

    $ git flow hotfix start vx.x.x
    
  2. feature

    挑选提交
    $ git cherry-pick J^..L
    
  3. 完成修补程序,本质上将精选的提交合并到

    master
    develop

    $ git flow hotfix finish vx.x.x
    
  4. 确保我永远不会通过在本地删除它们并可能在

    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 更优雅地解决这个问题,但我认为这以一种稍微优雅的方式解决了这个问题。


0
投票

git rebase -i --onto E H L

将 JKL 重新设置为 E

© www.soinside.com 2019 - 2024. All rights reserved.