Mercurial将提交移动到另一个分支

57

我的同事不小心在默认分支上提交了两次代码,而不是创建自己的开发分支。

我应该如何处理这种情况,将这两次提交移动到一个新的分支上?


1
可能是如何在Mercurial中将某些变更集移动到新分支的重复问题。 - Peter O.
3个回答

56

假设以下情景:

D
|
C
| "I want to move C and D here"
B/
|
A

步骤:

  1. hg update B
  2. hg branch "mybranch"
  3. hg commit --message "Create my branch"
  4. hg update mybranch
  5. hg graft -r C
  6. hg graft -r D
  7. hg strip -r C (这应该是修订版 C 最初的状态)

    strip 命令由一个需要启用的扩展程序提供。你可以在 Mercurial Wiki 上查看有关如何启用它的指南

  8. hg update default

1
我很高兴我能帮忙! - Pilo
2
这很棒。不过,要使用它我必须启用剥离扩展。为了做到这一点,我不得不编辑位于我的用户配置文件夹中的mercurial.ini文件,并添加[extensions]部分,然后在下一行加上strip =。更多信息可以在这里找到:http://mercurial.selenic.com/wiki/StripExtension - jahu
尽管这很有用,但如果更改被推送了,它可能不起作用(至少在我处理未推送的修订时有效)。 - jahu
非常感谢!不过,在示例中,如果您将分支命名为除a、b、c、d之外的其他名称,例如:生产、开发、功能搜索、修复破损的URL或一些合理的虚构名称,那么更容易理解。这样阅读起来更容易 :) - OZZIE

41

一个重要问题

这些意外提交是否已经到达其他存储库,还是只在他自己的存储库中?如果是后者,则可以跳过下面的“也许猫还在袋子里”部分,否则您可能需要做很多工作。


你不是一个人

这里查看关于如何在Stack Overflow上修正问题的更多讨论。所描述的是“正确”的方法。

  • 导出补丁
  • 创建分支
  • 导入补丁
  • 删除早期提交。


也许猫还在袋子里

如果更改仅存在于本地副本中,则更简单的解决方案是:

  • 创建新分支
  • 切换到它
  • 使用您喜欢的合并工具(去Meld)或hg graft将更改合并到其中
  • 使用hg strip命令删除旧分支上的更改
  • 将更改推送到全球
  • 假装什么都没发生,哼着快乐的小曲......

2
如果猫还在袋子里,移植扩展也可以帮助解决问题,在克隆的存储库中再次确认以确保更改不会永久损坏。 - Lasse V. Karlsen

9
上面的两个答案都是正确的,但是假设一个人还没有推送提交,那么有第三种方法。
我刚刚成功地使用了rebase命令将一系列提交移动到一个主题分支上,而我一开始忘记了创建该分支。
我首先更新到我想要创建的分支的修订版,然后在此新分支上将我的错误分支中最早的提交加入,并且完成了。
花费的时间比使用TortoiseHg甚至命令行来解释它更多。

2
一个小细节:在更新到分支修订版之后,您必须首先使用hg branch创建新分支,或在TortoiseHg的提交窗口中设置分支名称。之后,所描述的变基操作可以正常工作,并且会有趣地应用新的分支名称。 - qwertfisch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接