【发布时间】:2019-11-20 10:36:37
【问题描述】:
我有两个分支,B1 和 B2,在以下设置中
[B1]
-o-o-d1-d2-d3
\
c1-c2-c3
[B2]
我想将提交 c1 切换到 B1 以实现以下设置
-o-o-d1-c1-d2-d3
\
c2-c3
我知道我可以将 c1 挑选到第一个分支上。但如果我只在分支 B1 上更改了 c1,我的历史记录会更清晰。 (我承认,这个问题可以看作是一个美学问题......但我希望 git 有一个很好的解决方案。)
【问题讨论】:
-
这能回答你的问题吗? Git: How to rebase to a specific commit?
-
@TimBiegeleisen:谢谢。所以在第 2 步中,我仍然会写
pick但使用 c2 的哈希? -
请注意,从提交
d2回到提交d1的连接实际上是一部分d2本身。任何现有提交的任何部分都不能更改,因此为了达到您想要的结果,您必须将现有的d2复制到其父级为c1的新提交(具有不同的哈希 ID)。现有的c1可以重复使用,但必须复制d2。我们可以将新改进的副本称为d2'。复制d2后,您还必须将d3换成新的和改进的副本,以便d3'引用d2'。这样就完成了所有的复制,之后分支名称标签B1需要调整。 -
整个过程——将一些提交复制到新的和改进的版本,然后调整分支标签以指向最终复制的提交——正是
git rebase所做的。您可以手动将其拆分为一系列git cherry-pick命令,每个命令复制一个提交,然后是git branch -f,这是RomainValeri's answer 中的内容,或者使用git rebase,如Phlippe's answer。跨度>