我已经提交了A,B,C,D和E.我意识到在提交B中发生了一些非常糟糕的事情,所以我想恢复到A,这次更改正确,之前搞砸了B,然后自动重新应用C,D和E.
你可能想知道我为什么不回到B并在那里修复,然后重新回到E(这是一个好主意吗?)。原因我不太了解,但它与一组特殊的视觉工作室文件中出现的问题(应该只通过视觉工作室中的某些GUI屏幕进行编辑)有关,这些文件不能简单地纠正发生错误后的文件...如果我知道它们,我会提供更多详细信息
答案 0 :(得分:5)
只需退出你在B中所做的事情并将其作为F提交。这样,历史将完好无损,而你的同行将在不必知道的情况下获得变更。
如果B是服务版本,请在那里进行更改,然后将其合并到F中。
答案 1 :(得分:4)
这可以使用Mercurial Queues(mq)完成。你想要:
这样做如下:
cd <project>
hg qinit
hg qimport --rev B:E
hg qpop --all
hg qpush <patch name for B>
hg qrefresh
hg qpush --all
hg qfinish --applied
这一切都假设B到E还没有被推送到任何公共存储库。如果他们已被推,那么你最好的办法就是在新的变更集(F)中解决问题。
答案 2 :(得分:3)
您也可以使用HisteditExtension(而不是MqExtension)。 MqExtension更强大,但我认为它也更复杂。 HisteditExtension有点像git rebase --interactive
。
# Ordinarily it would be something like (I'd normally do -r -5, instead):
hg histedit d0844102a010
您的文本编辑器将打开一个如下所示的文件:
pick d0844102a010 A
pick a9448f0ba534 B
pick b754f9f2513b C
pick 736f7f2363ff D
pick 05bb58f48597 E
# Edit history between d0844102a010 and 05bb58f48597
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# f, fold = use commit, but fold into previous commit
# d, drop = remove commit from history
#
每一行对应一次提交。第一个单词指的是要应用于该提交的命令。默认的“选择”只保持提交不变。使用“编辑”进行更改(包括提交日志更改),“折叠”以将其与先前的提交相结合,并使用“删除”将其完全删除。
在您的情况下,您可能只需要将第一行更改为“编辑”。
请记住,必须使用hg histedit --continue
而不是hg commit
(如果您正在“编辑”或存在合并冲突)。 :)如果您遇到冲突且事情看起来不太好而您只想取消,那么您可以使用hg histedit --abort
。
# Fix up files...
vim foo bar baz
# Finished; apply the changes (and pray for a clean merge ;).
hg histedit --continue
当然,自担风险编辑历史记录。我建议您在编辑历史记录之前创建源树的备份tarball或zip,直到您熟悉这些命令。