问题
基本上,我有一个不好的习惯,忘记了在开发过程中忘记分支机构的习惯。这给我带来了巨大的提交痕迹,很难看到一个功能从哪里开始,下一个功能的结束。
可能的解决方案
提交是为了使我只想能够将单个主分支分为几个较小的特征分支,这些分支合并回主。
当前的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'
表示commitA
的补丁和消息,但由于父母已更改。 -
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
请注意,在您的图中,您已经标记了以前的非混合提交
D
和H
,因为合并最终提交。我不相信这是您想要的,因为您通常会在这些提交中具有不同的补丁和消息,您想与合并提交分开。我在最终结果中分别添加了M1
和M2
。
您应该能够使用此信息:
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上选择从
E
到H
的所有内容。
注意,我们在这里选择
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个步骤
"理想"图有点模棱两可,因为合并提交未清楚地指定。在图中,D
和H
似乎是合并的,但不应该是。
这是重建历史图的一种可能解决方案:
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
请注意,到目前为止,feature1
和feature2
是本地分支。如有必要,您可以将它们推到遥控器。besieds,master
已重写。您可能需要将其强制使用以在远程存储库中进行更新。