将单个分支历史记录转换为许多较小的合并分支



问题

基本上,我有一个不好的习惯,忘记了在开发过程中忘记分支机构的习惯。这给我带来了巨大的提交痕迹,很难看到一个功能从哪里开始,下一个功能的结束。

可能的解决方案

提交是为了使我只想能够将单个主分支分为几个较小的特征分支,这些分支合并回主。

当前的git回购:

-- A -- B -- C -- D -- E -- F -- G -- H => master

理想的git回购:

       B -- C => feature1 
     /       
-- A --------- D -- E --------- H => master
                             /    
                       F -- G => feature2

我尝试了

我读过其他类似的问题,但找不到任何描述我的问题。我已经尝试过git rebase,但在这种情况下不确定如何确切使用它,也可能需要--onto选项。

任何帮助都非常感谢,因为这将使我的存储库看起来更好!

legend

  • A'表示commit A的补丁和消息,但由于父母已更改。
  • branch-name*表示branch-name是当前结帐分支,为HEAD

-- A -- B -- C -- D -- E -- F -- G -- H => master

       B -- C -- D
     /            
-- A ------------- M1 -- E ------------ M2 => master
                                      /    
                            F -- G -- H

请注意,在您的图中,您已经标记了以前的非混合提交DH,因为合并最终提交。我不相信这是您想要的,因为您通常会在这些提交中具有不同的补丁和消息,您想与合并提交分开。我在最终结果中分别添加了M1M2

您应该能够使用此信息:

git checkout master

git reset --hard A

-- A => master*
    
      B -- C -- D -- E -- F -- G -- H

git checkout -b feature1 D(不需要,但可以充当标签(

                   => feature1
                 /                       
      B -- C -- D -- E -- F -- G -- H
     /
-- A => master*

git merge --no-ff feature1

                   => feature1
                 /                       
       B -- C -- D -- E -- F -- G -- H
     /            
-- A ------------- M1 => master*

git cherry-pick E

                     => feature1
                   /                       
       B -- C --  D -- E -- F -- G -- H
     /             
-- A -------------- M1 -- E' => master*

git checkout -b feature2 H

                     => feature1
                   /                       
       B -- C --  D -- E -- F -- G -- H => feature2*
     /             
-- A -------------- M1 -- E' => master

git rebase --onto E master

重置为师父,樱桃在rebase上选择从EH的所有内容。


注意,我们在这里选择E,而不是E',因为--onto是关于重新重塑分支的历史记录,而不是我们在之上重新审理的。等效是git rebase --onto F^ master,其中F^是指git中的F的父母。

                     => feature1
                   /                       
       B -- C --  D -- E -- F -- G -- H
     /             
-- A -------------- M1 -- E' => master
                            
                             F' -- G' -- H' => feature2*

git checkout master

                     => feature1
                   /                       
       B -- C --  D -- E -- F -- G -- H
     /             
-- A -------------- M1 -- E' => master*
                            
                             F' -- G' -- H' => feature2

git merge --no-ff feature2

                   => feature1
                 /                       
      B -- C -- D -- E -- F -- G -- H
     /           
-- A ------------ M1 -- E' --------------- M2 => master*
                                         /    
                            F' -- G' -- H' => feature2

最终结果当没有任何指定指向它们的提交时被丢弃:

      B -- C -- D => feature1
     /           
-- A ------------ M1 -- E' --------------- M2 => master*
                                         /    
                            F' -- G' -- H' => feature2

我可能会遵循以下模式:

git checkout -b master_backup master

然后

git checkout master
git reset --hard [SHA position]

注意sha位置只是您想开始的提交哈希。

现在

git checkout -b feature-name master
git cherry-pick [sha-1]^...[sha-2]

请注意,^符号使樱桃选拔范围包括[SHA-1]

然后最后

git checkout master
git merge --no-ff feature

并继续为您要添加到主拓扑中的每个功能的最后4个步骤

"理想"图有点模棱两可,因为合并提交未清楚地指定。在图中,DH似乎是合并的,但不应该是。

这是重建历史图的一种可能解决方案:

git checkout master
git reset A --hard
git cherry-pick D
git branch feature1 C
git merge feature1 --no-ff
git cherry-pick E
git branch feature2
git cherry-pick H
git checkout feature2
git cherry-pick F G
git checkout master
git merge feature2 --no-ff

请注意,到目前为止,feature1feature2是本地分支。如有必要,您可以将它们推到遥控器。besieds,master已重写。您可能需要将其强制使用以在远程存储库中进行更新。

最新更新