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回退工具
这将创建一个新的磁头,您需要将其与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”分支机构,以避免这些风险。(另请参见下面的评论。)
有关详细信息,请参阅。使用回退工具,但请注意您正在执行的操作:
- 在分支上执行回退后,不需要提交
马上。如果(在发生的变化中)有什么变化,最好先检查一下
在选择了
option)之后,是否对其他选项进行了一些更改 你不想退出的分支。如果是,请先取消选中 承诺李>Backout
- 如果您现在(或以后)将分支
(或“编号分支”)合并到分支1-2
,您将丢失更改集A-Z
(包括)之前“编号分支”的所有更改,-这就是@Marvin答案中的警告2
- 为了避免这种情况,您需要将此备份传播到“编号的分支”中,并重做已备份的更改(后面的步骤)
A-Z
不是“编号分支”的直接继承者,则查找A-Z
和1-2
之间的第一个子分支,并将工作台更新到其顶端A-Z
(=退出)->中的最新版本,然后单击“与本地合并”
- 如果
和A-Z
之间有更多分支,请重复步骤4。五,1-2
- 不要将任何内容合并到分支
中1-2
- 注意:始终只将任何分支合并到其来源的分支中否则,在将来的合并之后,您可能会丢失一些更改
1-2
的更改(例如修订版D
-Z
)。
- 不幸的是,这必须手动检查。但这是纠正两个分支的唯一安全方法
$ 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
| |