如何在主分支历史中更早地移动 git 对多个分支的共同提交?

How to move git commits common to multiple branches earlier in the main branch history?

我有一个 git 存储库,如下所示:

   /C''-D''-F (featureB)
A-B-C---D---E (main)
   \C'--D'--G (featureA)

我想将公共提交 CD 移到 main 分支的更早位置 历史使回购看起来像这样:

       /F (featureB)
A-B-C-D-E (main)
       \G (featureA)

重要的是要注意 C/C'/C''D/D'/D'' 提交修改代码相同,但由于在不同的分支中,它们都有不同的提交哈希值。

[C and D]...modify the code identically but have different commit hashes across the three branches.

在这种情况下,您可能需要先从两个功能分支中删除 C 和 D 提交,然后再变基到主分支。您可以使用 git rebase -i 来完成第一部分,对您不想要的提交使用 drop 选项。然后(从每个分支)git rebase mainmain 分支的当前状态之上重播每个分支中的提交。

让我们重新表述手头的任务:

I want to take the changes of the N latest commits of a branch and move/copy them in a way that their parent commit becomes a different one.

这就是 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