我们有意无意地将命名分支(ABC
)合并到我们的default
分支中。
hg rollback
不是一个选项,因为自那以后有几次提交。
有没有办法撤消这个?
答案 0 :(得分:8)
您将需要Mq扩展名。如果您没有将其打开,请将其添加到Mercurial.ini
或.hgrc
文件中。
[extensions]
hgext.mq=
如果你不熟悉它,Mq extension让你操纵历史。好消息是,这将允许我们修复你的回购。坏消息是任何克隆混乱仓库的人都必须再次克隆它,因为我们将改变历史。
首先,再次使用你的仓库克隆,所以我们不会弄乱任何东西。
现在,找到合并变更集的修订版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.
基本上,您在默认分支之上重新定义新的变更集,删除流程中的合并变更集。完成后,您需要将更改推送到服务器上的新存储库,并让同事克隆新的副本。
最后,如果您有任何其他Mercurial问题,请查看kiln.stackexchange.com。
<强>更新强>
我忘了提及:如果有人对仅在另一个分支中的某些内容进行了更改,则hg qpush -a
可能会失败。你会看到一个foo.txt.rej
和foo.txt.orig
文件。不幸的是,你必须自己解决这个问题。要解决此问题,请打开原始文件.orig
文件和.rej
文件,然后选择要合并的正确更改,并将其保存在原始文件中。将其合并后,使用hg qrefresh
将该补丁更新为新的合并补丁。从他们那里,您应该能够再次运行hg qpush -a
并继续。如果您在另一个补丁上再次遇到相同的错误,请按照相同的过程进行操作。
答案 1 :(得分:4)
如果您尚未公开发布回购,则可以执行此操作
hg clone -r (parent1 of bad merge) -r (parent2 of bad merge) old new
并删除旧的仓库。
答案 2 :(得分:3)
我今天遇到了以下情况:
@ changeset: 1728:5d703e1051d3
|\ parent: 1727:1a5f73b5edb4
| | parent: 1720:65ddd0bde225
| | user: nn
| | date: Wed Feb 27 10:35:00 2013 +0100
| | summary: Merge with SomeBranch
| |
| o changeset: 1727:1a5f73b5edb4
| | user: nn
| | date: Wed Feb 27 10:34:30 2013 +0100
| | summary: lorem ipsum
| |
[some more changesets]
| |
o | changeset: 1720:65ddd0bde225
| | branch: SomeBranch
| | user: nn
| | date: Wed Feb 27 07:44:46 2013 +0100
| | summary: lorem ipsum
其中 SomeBranch 不应合并到默认。我们要解决这个问题的方法是使用带有backout
选项的parent
命令,如下所示:
hg backout --rev=1728 --parent=1727
通过这个你不撤消合并本身:看一个分支图(使用图形日志或在TortoiseHg中)你仍然会看到 SomeBranch 进入在r1728 默认。然而,合并的结果是撤消的,这意味着包含退出的变更集(在我的情况下为r1729)与r1727相同。
答案 3 :(得分:1)