我有一个git repo,我想完全重组。
总而言之,我有三个功能,让我们称之为A
,B
,C
,我一直在努力过去几周不幸的是,关于如何使用分支来正确地分解我的功能,我有点没有意思,而且我甚至在提交之间也从功能跳到功能。
所以现在我有三个分支A_devel
,B_devel
,C_devel
,并且在每个分支中有一堆属于三个功能中的每一个的提交。某些功能A
的提交还包含B
中功能B_devel
的一些更改,B
中的某些更改A
中的C_devel
等上。有些提交甚至在master
分支中,包含对任何功能的更改。并且所有提交也已经推送到origin
。
这完全混乱......
...我现在想清理一下。
至少我可以从提交消息中看到,在某些情况下,只是从代码中看到我在每个特定提交中所做的工作。所以我知道哪个提交属于哪个功能。我只需要知道如何将移动提交到相应的正确分支。
//编辑:顺便说一句,我必须提到我是唯一一个在本地和原点上工作的人。所以很可能没有人会因为历史变化而出现问题......以防万一有必要。
答案 0 :(得分:1)
绝对不是一个好的解决方案,但是如果你要浏览整个日志,理论上你可以使用git cherry-pick <commithash>
的组合来从一个分支到另一个分支,git rebase -i
(交互式rebase)重新排序分支中的提交。
答案 1 :(得分:1)
在阅读其余答案之前请注意以下事项:
所以我建议的策略如下。考虑以下结构,该结构在两个分支上具有与特征A和B相关的混合变化:
A1--A2--B1--B2--A3 (A_Devel HEAD)
/
o-o-X (master HEAD)
\
B3--B4--A4--B5 (B_Devel HEAD)
我们想要的是:
A1--A2--A3--A4 (A_Devel HEAD)
/
o-o-X (master HEAD)
\
B1--B2--B3--B4--B5 (B_Devel HEAD)
将与功能A相关的所有提交从B_Devel复制到A_Devel:
git checkout A_Devel
git cherry-pick A4
给
A1--A2--B1--B2--A3--A4 (A_Devel HEAD)
/
o-o-X (master HEAD)
\
B3--B4--A4--B5 (B_Devel HEAD)
git checkout B_Devel
git cherry-pick B1 B2
给予
A1--A2--B1--B2--A3--A4 (A_Devel HEAD)
/
o-o-X (master HEAD)
\
B3--B4--A4--B5--B1--B2 (B_Devel HEAD)
git checkout A_Devel
git rebase -i HEAD~~~~
(我们想删除B1,B2)
pick B1
pick B2
pick A3
pick A4
删除前两行并保存并退出编辑器。等待rebase完成。
现在我们将:
A1--A2--A3--A4 (A_Devel HEAD)
/
o-o-X (master HEAD)
\
B3--B4--A4--B5--B1--B2 (B_Devel HEAD)
同样,对于分支B_Devel:
git checkout B_Devel
git rebase -i HEAD~~~~~~
(我们想在最近的6次提交中更改内容)
pick B3
pick B4
pick A4
pick B5
pick B1
pick B2
删除带有A1的行并重新排序剩余的“B”更改,使它们看起来像:
pick B1
pick B2
pick B3
pick B4
pick B5
保存,退出,等待rebase完成,最终会给我们:
A1--A2--A3--A4 (A_Devel HEAD)
/
o-o-X (master HEAD)
\
B1--B2--B3--B4--B5 (B_Devel HEAD)