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
Mercurial-撤销旧的合并_Mercurial - Fatal编程技术网

Mercurial-撤销旧的合并

Mercurial-撤销旧的合并,mercurial,Mercurial,我有一个看起来像这样的分支: A->B->C->D->...->Z ^ 1->2-^ 其中C是2及其祖先的合并 我现在意识到我不应该合并。我可以回到B并移植D…Z,但那是大量的工作。我能退出来吗?C 当我尝试hg backout--merge C时,我得到了abort:无法回退合并变更集 这些更改已被推送到中央回购协议,我不想修改历史记录或任何东西,我只想使用2的反向,它的祖先返回到具有B的公共后代。您可以使用thg回退工具 更新合并更改集(C)

我有一个看起来像这样的分支:

A->B->C->D->...->Z
     ^
1->2-^
其中
C
2
及其祖先的合并

我现在意识到我不应该合并。我可以回到
B
并移植
D
Z
,但那是大量的工作。我能退出来吗?
C

当我尝试
hg backout--merge C
时,我得到了abort:无法回退合并变更集


这些更改已被推送到中央回购协议,我不想修改历史记录或任何东西,我只想使用
2
的反向,它的祖先返回到具有
B

的公共后代。您可以使用thg回退工具

  • 更新合并更改集(C)
  • thg回退
  • 选择要退出的父级(无论(2)的修订是什么)-注意,您实际上在对话框中选择了要保留而不退出的父级更改
  • 单击下一步
  • 单击提交

  • 这将创建一个新的磁头,您需要将其与Z合并或重新设置为Z。

    您可以将
    D
    重新设置为
    Z
    B
    。for rebase甚至讨论了一些类似的情况。这应该可以在一个命令中实现。

    有点晚了,但我不久前也遇到过同样的情况。这对我来说很顺利:

    hg update -C -r "revision-C"
    hg revert --all -r "revision-B"
    hg commit -m 'UNDO blah blah whatever the merge did'
    hg update -C -r "revision-Z-or-whatever-the-current-head-is"
    hg merge -r "the-new-revision-created-in-step-3"
    
    基本上,这正是backout所做的

    免责声明:但是请注意,如果您以后想再次合并1->2分支,您很可能会遇到一些问题。“一些问题”在这里是一个有点委婉的术语。事实上,在这种情况下甚至可能出现大问题。这种情况是危险的,主要是因为问题可能会在很久以后出现,而且完全出乎意料。强烈建议完全放弃“1”分支机构,以避免这些风险。(另请参见下面的评论。)


    有关详细信息,请参阅。

    使用回退工具,但请注意您正在执行的操作:

  • 更新合并更改集(C)
  • 右键单击该更改集->单击退出
    • 在分支上执行回退后,不需要提交 马上。如果(在发生的变化中)有什么变化,最好先检查一下 在选择了
      Backout
      option)之后,是否对其他选项进行了一些更改 你不想退出的分支。如果是,请先取消选中 承诺
  • 单击提交
    • 如果您现在(或以后)将分支
      1-2
      (或“编号分支”)合并到分支
      A-Z
      ,您将丢失更改集
      2
      (包括)之前“编号分支”的所有更改,-这就是@Marvin答案中的警告
    • 为了避免这种情况,您需要将此备份传播到“编号的分支”中,并重做已备份的更改(后面的步骤)
  • 如果分支
    A-Z
    不是“编号分支”的直接继承者,则查找
    A-Z
    1-2
    之间的第一个子分支,并将工作台更新到其顶端
  • 右键单击
    A-Z
    (=退出)->中的最新版本,然后单击“与本地合并”
    • 如果
      A-Z
      1-2
      之间有更多分支,请重复步骤4。五,
    • 不要将任何内容合并到分支
      1-2
    • 注意:始终只将任何分支合并到其来源的分支中否则,在将来的合并之后,您可能会丢失一些更改
  • 更新至“编号分支”的尖端
  • 找到所有被回退更改的文件(在文件系统上),并将它们复制到某个临时目录
  • 右键单击编号分支的最新版本的取消器->单击“与本地合并”
  • 将文件从步骤7复制回文件系统
  • 检查工作台中的更改并取消选中所有非分支机构
    1-2
    的更改(例如修订版
    D
    -
    Z
    )。
    • 不幸的是,这必须手动检查。但这是纠正两个分支的唯一安全方法
  • 单击提交
  • 提示:要真正确定哪些文件受到任何合并的影响,请右键单击该修订,然后单击“差异到父项”

    这基本上就是我们今天使用的场景,当我们发现一个分支(仍在开发中)意外地合并到默认值中(而不是另一个分支,它在修订图中具有相同的颜色:)。(这两个分支在此合并之后都推送了更改。)这可能看起来很耗时,但仍然比仅退出合并并在几天(或几周)后发现大量意外错误要好。(根据自己的经验。)

    合并是公共的,并且在此合并上有公共提交 假设我们有此已发布的提交历史记录(top是最新的):

  • 将合并(revTmp1)后的更改复制到所需分支(revB)

  • 创建“回退”提交

  • 清理临时文件

    $ hg strip revTmp1 revTmp2
    
                      revZ'          <- reverted revC merge
                       |  
                      revZ
                       |  
                      revD
                       |
                      revC     <- unwated merge commit (rev2 to revB)
                       |   \    
    wanted branch ->  revB  rev2    <- unwanted branch
                       |     |
    
    $hg条带revTmp1 revTmp2
    
    revZ'Mercurial允许退出合并修订版;但是,该功能已被弃用。危险在于回退只执行反向提交;如果您改变主意并希望重新添加已删除的合并,则不能通过再次合并分支来完成此操作。(Hg将拒绝与当前版本的祖先执行合并;或者,如果合并后分支上有其他提交,它将只合并以下提交。)

    命令语法为:

    hg backout--rev MergeRevision--parent ParentRevision

    其中ParentRevision是原始分支上合并修订的父级(即不在合并分支上);通常,这是合并的第一个父级

    该命令在OrtoiseHg工作台中不可用


    执行撤销(并解决潜在冲突)后,确保审查新修订版,并在必要时进行修订。

    Tom,但这不会撤销1,对吗?
                      revZ'
                       |
                      ...  
                       |
                      revD'
                       |       
    wanted branch ->  revB  rev2    <- unwanted branch
                       |     |
    
    $ hg update -r revC                # Update to merge commit
    $ hg revert --all -r revZ          # revert to the newest commit
    $ hg commit -m "collapsed commits" # Create new commit (revTmp1)
    
                       revZ
                        |  
                       ...
                        |  
               revTmp1 revD
                     \ /
                     revC
                      |  \    
                    revB  rev2
                      |    |
    
    $ hg update -r revB    # Update to the last "wanted" commit before merge
    $ hg graft -r revTmp1  # Copy changes from revTmp1 (create revTmp2 commit)
    
                       revZ
                        |  
                       ...
                        |  
               revTmp1 revD
                     \ /
            revTmp2  revC
                  \  / \    
                 revB  rev2
                   |     |
    
    $ hg update -r revZ                   # Update to the top commit
    $ hg revert --all -r revTmp2          # Copy state revTmp2
    $ hg commit -m "reverted revC merge"  # Create revZ' commit
    
                       revZ'
                        |
                       revZ
                        |  
                       ...
                        |  
               revTmp1 revD
                     \ /
            revTmp2  revC
                  \  / \    
                  revB  rev2
                   |     |
    
    $ hg strip revTmp1 revTmp2
    
                      revZ'          <- reverted revC merge
                       |  
                      revZ
                       |  
                      revD
                       |
                      revC     <- unwated merge commit (rev2 to revB)
                       |   \    
    wanted branch ->  revB  rev2    <- unwanted branch
                       |     |