问题描述
我有一个看起来像这样的 git 仓库:
/C''-D''-F (featureB)
A-B-C---D---E (main)
\C'--D'--G (featureA)
我想将 C
和 D
的常见提交更早地移到 main
分支中
历史,以便回购看起来像这样:
/F (featureB)
A-B-C-D-E (main)
\G (featureA)
需要注意的是,C
/C'
/C''
和 D
/D'
/D''
提交修改的代码相同,但由于在不同的分支,它们都有不同的提交哈希。
解决方法
让我们重新表述手头的任务:
我想获取一个分支的 N 个最新提交的更改,并以它们的父提交变成不同的方式移动/复制它们。
这就是 git rebase
允许您执行的操作。您可以告诉它要复制的提交范围以及要将其复制到哪个父提交:
git rebase --onto main^ featureA^ featureA
git rebase --onto main^ featureB^ featureB
会将 featureA 和 featureB 的最新提交变基到分支 main 的倒数第二次提交。您也可以直接使用提交哈希:
git rebase --onto D D' featureA
git rebase --onto D D'' featureB
,
[C 和 D]...修改相同的代码,但在三个分支中具有不同的提交哈希。
在这种情况下,您可能希望首先从两个功能分支中删除 C 和 D 提交,然后重新定位到主分支。您可以使用 git rebase -i
来完成第一部分,对您不想要的提交使用 drop
选项。然后(从每个分支)git rebase main
在 main
分支的当前状态之上重放每个分支中的提交。