在阅读其余答案之前,请注意以下几点:
- git reset 或 rebase 都会重写历史记录,所以如果历史记录已经发布,则不应使用它们。在您的情况下,这应该不是问题,因为您是唯一使用该存储库的人。
- 从 v1.7.1 开始,cherry-pick 可以选择多个提交,因此您可以使用它来“拉出”多个提交。
所以我建议的策略如下。考虑以下结构,它在两个分支上包含与特征 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
删除前两行并保存并退出编辑器。等待变基完成。
现在我们将拥有:
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)