我可以用另一个分支的提交替换旧的提交吗?
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
假设我有一个分支 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