Mercurial - 退出旧合并

Geo*_*uer 15 mercurial

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

A->B->C->D->...->Z
     ^
1->2-^
Run Code Online (Sandbox Code Playgroud)

哪里C2和它的祖先合并.

我现在意识到我不应该合并.我可以回去B嫁接D...... Z但这是很多工作.我可以退出C吗?

当我尝试hg backout --merge C,我得到中止:无法回退合并变更.

这些变化已被推送到中央回购,我不打算修改历史或任何东西,我只想要反过来,2它的祖先回到共同的后代B.

Mar*_*ski 12

合并是公开的,并且对此合并有公开提交

假设我们有这个已发布的提交历史(顶部是最新的):

                  revZ
                   |
                  ...  
                   |
                  revD
                   |
                  revC     <- unwated merge commit (rev2 to revB)
                   |   \    
wanted branch ->  revB  rev2    <- unwanted branch
                   |     |
Run Code Online (Sandbox Code Playgroud)

相反,我们希望有顶级状态,好像我们有这样的历史:

                  revZ'
                   |
                  ...  
                   |
                  revD'
                   |       
wanted branch ->  revB  rev2    <- unwanted branch
                   |     |
Run Code Online (Sandbox Code Playgroud)

如何实现这一目标(一步一步)

  1. 将合并提交(rev4 - rev5)后的历史记录折叠为一个提交

    $ 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
                      |    |
    
    Run Code Online (Sandbox Code Playgroud)
  2. 合并后将更改('rev6')复制到所需分支('rev1')

    $ 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
                   |     |
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建"退出"提交

    $ 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
                   |     |
    
    Run Code Online (Sandbox Code Playgroud)
  4. 清理临时提交

    $ hg strip revTmp1 revTmp2
    
                      revZ'          <- reverted revC merge
                       |  
                      revZ
                       |  
                      revD
                       |
                      revC     <- unwated merge commit (rev2 to revB)
                       |   \    
    wanted branch ->  revB  rev2    <- unwanted branch
                       |     |
    
    Run Code Online (Sandbox Code Playgroud)


Mar*_*win 9

有点晚了,但我前一段时间也有同样的情况.这对我很顺利:

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"
Run Code Online (Sandbox Code Playgroud)

基本上,这正是退出的作用.

免责声明:请注意,如果您将来要再次合并1-> 2分支,您很可能会遇到一些问题.而"一些问题"在这里是一个有点过分的术语.事实上,即使是大问题也可能出现在这种情况下.这种情况很危险,主要是因为这些问题可能会在以后发生并且完全出乎意 强烈建议完全放弃"1"分支以避免这些风险.(另见下面的评论.)

有关详细信息,请参阅Backout wiki页面.


Tom*_*Tom 1

您可以使用 thg backout 工具。

  1. 更新合并变更集 (C)
  2. 事物撤销
  3. 选择您想要撤销的父级(无论 (2) 的修订是什么) -请注意,您实际上在对话框中选择了您想要保留而不是撤销的更改的父级
  4. 点击下一步
  5. 单击“提交”

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