git - 合并后如何恢复错误的rebase

时间:2017-02-14 21:54:24

标签: git

我有以下简单的分支模型:

A--B--C  <- master       

D--E--F  <- production, origin/production

在某一点上,我合并回master

A--B--C--M  <- master
         /
D--E--F-/   <- production

然后针对master(使用--onto)尝试了另一个分支的反叛但是站在错误的地方,所以历史变成了:

A--B--C--M  <- master,production    
         /
D--E--F-/   <- origin/production

所以,现在,我masterproduction指向同一个提交,这应该只是master的提交。

如何将production指回origin/production

1 个答案:

答案 0 :(得分:3)

如果你确定你的标签位于右侧侧,指向分支提示提交,我发现这更加清晰,因为这是分支名称在Git中实际工作的方式(它们指向一个提交,我们称之为分支的提示

A--B--C--M   <-- master
        /
 D--E--F     <-- production, origin/production

当你做了你所做的事情时,你没有复制任何提交(幸运的是),只是将标签production移动到指向提交M

A--B--C--M   <-- master, production
        /
 D--E--F     <-- origin/production

所以你现在需要做的就是把标签放回去,这样名称production就意味着“提交F”。为此,您可以使用命令Whymarrh gave in a comment

git checkout production && git reset --hard origin/production

git reset --hard告诉Git:

  • 重置当前分支(--soft--mixed--hard都这样做)以指向目标提交F; < / LI>
  • 重置索引(--mixed--hard都执行此操作)以使其内容成为目标提交F的内容;和
  • 重置工作树(仅--hard执行此操作)以使其内容成为目标提交F的内容。

因为第一步重置当前分支指针,我们需要git checkout选择production作为当前分支(当然,除非它已经是当前的)。 / p>

此时重置索引和工作树是所需的副作用,因为我们不打算在M之后将任何提取的索引或工作树内容带回到新的提交之后{ {1}}。