我可以用另一个分支的提交替换旧的提交吗?

Can I replace an old commit with a commit from another branch?

假设我有一个分支 B1,其最后一次提交是 C1 -> C2 -> C3,另一个分支 B2,其最后一次提交是 C4 -> C5 -> C6。

如何将 B1 上的提交 C2 替换为 B2 上的提交 C4?

您可以使用交互式变基来做到这一点 - 但不是 B1 在 B2 上的变基。相反,做:

git rebase -i B1 hash-of-C2^

(而不是 C2 的散列,您将输入 C2 的实际散列,即看起来像 ddc18e47147f4f5cb969609150c4d29040b2c07f 的十六进制字符串,您可以使用 git log)

然后,在编辑器中,您会看到:

pick short-hash-of-C2 commit comment here
pick short-hash-of-C3 commit comment here

(短哈希将是 C2 的完整哈希的前缀,例如 ddc18e47

现在,将 C2 的 keep 替换为 drop,但为 C4 添加一行,这样您现在拥有:

drop short-hash-of-C2 commit comment here
pick full-hash-of-C4
pick short-hash-of-C3 commit comment here

(请注意,C4 的短散列也应该有效,但我喜欢只复制整个散列而不是缩短它以防我弄乱它。)

就是这样。当然,由于这些更改,您可能需要解决冲突,就像在任何 rebase 中一样。

假设这些分支都已发布,您可能希望使用 revert/cherry-pick 选项:

# on branch B1
git revert C2
git cherry-pick C4

这将使分支 B1 如下所示:

C1 -- C2 -- C3 -- RC2 -- C4

但在功能上它应该大致相同:

C1 -- C4 -- C3