Mercurial Undo Merge

Ste*_*orn 14 mercurial branch

有一个场景,我们非故意将命名branch(ABC)合并到我们的default分支中.

hg rollback 不是一个选项,因为自那以后有一些提交.

有没有办法撤消这个?

tgh*_*ghw 8

你将需要Mq扩展.如果您没有打开它,请将其添加到您的Mercurial.ini.hgrc文件中.

[extensions]
hgext.mq=
Run Code Online (Sandbox Code Playgroud)

如果你不熟悉它,Mq扩展让你操纵历史.好消息是,这将允许我们修复你的回购.坏消息是任何克隆混乱仓库的人都必须再次克隆它,因为我们将改变历史.

首先,再使用你的仓库的另一个克隆来工作,所以我们不会搞砸任何东西.

现在,找到合并变更集的修订版ID(已合并default和您的命名分支).写下来.我们将其称为changesetM.现在找到下一个变更集的修订版ID.写下来.我们将其称为changesetN.

获得这两个修订版ID后,请转到命令提示符并cd进入您的仓库.然后键入以下内容,替换changeset[M|N]为相应的修订版ID:

$ hg qimport -r changesetN:tip
  # This will add all of your changes since the merge to the queue
$ hg qpop -a
  # This pops them all out of your history.
$ hg strip changesetM
  # This removes the merge changeset.
$ hg update -C default
  # Make sure we're on the default branch
$ hg qpush -a
  # Take the changesets in the queue and push them back onto your history.
$ hg qfinish -a
  # Remove changesets from the queue and finalize them as normal changesets.
Run Code Online (Sandbox Code Playgroud)

实质上,您在默认分支之上重新定义新的变更集,删除流程中的合并变更集.完成后,您需要将更改推送到服务器上的新存储库,并让同事克隆新的副本.

最后,如果您有任何其他Mercurial问题,请查看kiln.stackexchange.com.

UPDATE

我忘了提一下:如果有人对仅在另一个分支中的某些内容进行了更改,则可能hg qpush -a会失败.你会看到一个文件foo.txt.rejfoo.txt.orig文件.不幸的是,你必须自己解决这个问题.要解决此问题,请打开原始文件,.orig文件和.rej文件,然后选择要合并的正确更改,并将其保存在原始文件中.将其合并后,用于hg qrefresh将该补丁更新到新的合并补丁.从他们的,你应该能够hg qpush -a再次运行并继续.如果您在另一个补丁上再次遇到相同的错误,请按照相同的过程进行操作.


in3*_*xes 4

如果您尚未公开发布存储库,您可以执行此操作

hg clone -r (parent1 of bad merge) -r (parent2 of bad merge) old new
Run Code Online (Sandbox Code Playgroud)

并删除旧的存储库。