【发布时间】:2011-03-10 03:55:31
【问题描述】:
有一个场景,我们无意中将命名分支 (ABC) 合并到我们的 default 分支中。
hg rollback 不是一个选项,因为从那以后有几个提交。
有没有办法撤消这个?
【问题讨论】:
有一个场景,我们无意中将命名分支 (ABC) 合并到我们的 default 分支中。
hg rollback 不是一个选项,因为从那以后有几个提交。
有没有办法撤消这个?
【问题讨论】:
您将需要 Mq 扩展。如果您没有打开它,请将其添加到您的 Mercurial.ini 或 .hgrc 文件中。
[extensions]
hgext.mq=
如果您不熟悉它,Mq extension 让您操纵历史。好消息是,这将使我们能够修复您的回购。坏消息是任何人如果克隆了这个乱七八糟的代码库,就必须再次克隆它,因为我们将改变历史。
首先,创建另一个你的 repo 的克隆版本,这样我们就不会搞砸任何事情。
现在,找到合并变更集的修订 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 并继续。如果您在另一个补丁上再次遇到相同的错误,请按照相同的过程进行操作。
【讨论】:
hg strip 这不需要强制推送。如果很多人拉下 repo,这不是一个选择。
如果您尚未公开发布 repo,您可以这样做
hg clone -r (parent1 of bad merge) -r (parent2 of bad merge) old new
并删除旧的仓库。
【讨论】:
我今天遇到了以下情况:
@ 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 不应该被合并到 default 中。我们解决这个问题的方法是使用backout 命令和parent 选项,如下所示:
hg backout --rev=1728 --parent=1727
这样您不会撤消合并本身:查看分支图(使用图表日志或在 TortoiseHg 中)您仍然会看到 SomeBranch 进入默认 在 r1728。然而,合并的 result 被撤消,这意味着包含回退(在我的情况下为 r1729)的变更集与 r1727 相同。
【讨论】: