Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Version control 我怎样才能撤销Mercurial中的合并,然后再与该分支重新合并?_Version Control_Mercurial_Dvcs - Fatal编程技术网

Version control 我怎样才能撤销Mercurial中的合并,然后再与该分支重新合并?

Version control 我怎样才能撤销Mercurial中的合并,然后再与该分支重新合并?,version-control,mercurial,dvcs,Version Control,Mercurial,Dvcs,我有两个分支,default和branch1。我们团队中有一个人错误地合并了branch1和default。branch1中的内容尚未准备好与默认值合并(它包含对构建和部署环境的重大修改) 我们用“hg backout”做了一个实验,退出合并(不确定这是正确的方法)。然后默认情况下,branch1中的更改会被删除,这很好,但我们不能与branch1重新合并 我们应该如何解决这个问题?您不能很好地撤销合并。在我看来,最好的处理方法就是放弃合并,继续合并前的变更集串,留下一个悬垂的头部(可以剥离)。

我有两个分支,default和branch1。我们团队中有一个人错误地合并了branch1和default。branch1中的内容尚未准备好与默认值合并(它包含对构建和部署环境的重大修改)

我们用“hg backout”做了一个实验,退出合并(不确定这是正确的方法)。然后默认情况下,branch1中的更改会被删除,这很好,但我们不能与branch1重新合并


我们应该如何解决这个问题?

您不能很好地撤销合并。在我看来,最好的处理方法就是放弃合并,继续合并前的变更集串,留下一个悬垂的头部(可以剥离)。如果合并后发生了其他更改,则可以将这些更改重新设置到新的“良好”标题上。

此答案假设您已按下

这将导致(至少一个)未解决的头部,这取决于您刚才忘记了什么。更多取决于谁刚刚从哪个分支推出

我喜欢HG并热衷于使用它,但他们关于分支的想法与(设计上)故意不改变的历史结合在一起时,会让人抓狂

正因为这个原因,我通常在进行分支合并之前(本地)克隆回购的备份。我总是在拉之前检查一下

Eric Raymond或多或少不知道DVCS,它可以(希望)在类似于您描述的oops的情况下提供帮助,但我认为他不会在接下来的一两周内完全实现HG支持。不过,这可能值得一看


但是,只有在没有人使用“oopsie”提示的情况下才有用。

这里有很多场景,您可能需要这样做,我将每个场景作为标题,以便您可以找到适合您情况的场景。请注意,我仍在学习Mercurial,如果我所说的是错误的,使用错误的术语,我希望得到一些提示,可以做得更好,等等

无进一步更改,合并未共享(无推/拉) 程序员已经合并,但没有做任何其他事情,也没有以任何方式与任何人共享更改

在这种情况下,只需丢弃本地克隆,并从安全存储库中获取新克隆

合并顶部的本地更改,而不是共享 程序员已经合并,并在合并的基础上继续工作。合并后的变更集应该保留,但合并本身应该删除。更改(合并+以下更改集)尚未与任何人共享

在这种情况下,我将执行以下四种操作之一:

  • 尝试使用REBASE扩展,这将把变更集从一个位置移动到另一个位置。如果变更集基于合并时引入的代码更改,则必须进行一些手动工作以协调差异
  • 尝试使用MQ扩展将要保留在修补程序队列中的变更集拉入,然后将它们推回到不同的位置。然而,就基于合并的更改而言,这将与重定基础扩展有相同的问题
  • 尝试使用移植扩展将更改从一个位置“复制”到另一个位置。尽管如此,前两个问题仍然存在
  • 再做一次,可能需要借助一个差分工具,在我想要放弃的变更集中进行更改,然后在正确的位置重新进行更改
  • 要除去合并变更集+以下所有变更集,有两个选项:

  • 在MQ扩展中使用strip命令

    hg strip <hash of merge changeset>
    
    hg带
    
  • 克隆和拉取,并指定导致合并(但不包括合并)的更改集的哈希。本质上,通过将损坏的克隆拉入新克隆来创建新克隆,并避免拉入不需要的合并

    hg clone damaged -r <hash of first parent> .
    hg pull damaged -r <hash of second parent>
    
    hg克隆已损坏-r。
    hg拉力损坏-r
    
  • 合并推送给其他人,控制克隆 程序员已推送到主存储库,或推送到其他人,或推送到程序员存储库中的其他人。但是,您(在开发人员组中)可以控制所有存储库,在完成更多工作之前,您可以与所有人联系和交谈

    在这种情况下,我会看看是否可以完成第1步或第2步,但这可能需要在很多地方完成,因此这可能涉及很多工作

    如果没有人完成了基于合并变更集的工作,我将使用步骤1或2进行清理,然后推送到主存储库,并要求每个人从主存储库获取新的克隆

    推合并,您无法控制克隆 程序员推送了合并集,而您不知道谁将拥有合并变更集。换句话说,如果你成功地从你的存储库中根除了它,那么仍然拥有它的人的一次不经意的推动就会把它带回来

    忽略合并变更集并在两个分支中工作,就好像它从未发生过一样。这将留下一个悬垂的脑袋。然后,当您合并了两个分支后,您可以对该头部执行空合并以除去它

      M         <-- this is the one you want to disregard
     / \
    *   *
    |   |
    *   *
    |   |
    

    M感谢大家的大力支持!由于我们急于解决这个问题,而且我们的团队对Mercurial比较陌生,所以我们采用了非常务实的解决方案

    在我们的存储库服务器上,我们创建了一个新的存储库,然后克隆了旧的存储库,直到合并之前的修订版本。然后将新克隆推送到服务器,并将新链接发送给所有人。幸运的是,我们是一个相当小的开发团队


    也许不是解决这个问题的最舒适的方法,但它确实奏效了:)

    我遇到了这个问题。一位同事在我的分支仍然不完整时,意外地将其合并到默认分支中。起初,我只是退出了合并,这似乎很好,直到我想将我的分支合并到默认值中。我需要的文件在合并时被标记为删除

    |   |
    *   *
    | M |       <-- this is the one you want to disregard
    |/ \|
    *   *
    |   |
    *   *
    |   |
    
      m
     / \
    *   *
    |   |
    *   *
    | M |       <-- this is the one you want to disregard
    |/ \|
    *   *
    |   |
    *   *
    |   |
    
      7     M       remerge
      6   /   \
      5   *   |     hg backout 3 (backout backout)
      4   |   *     fix error 
      3   *   |     hg backout 2
      2   M   |     fail merge
        /     \
      1 *     *
        |     |