Mercurial:如何撤消上次未执行的提交?

时间:2015-07-04 17:58:31

标签: mercurial

我不小心提交了我的本地存储库。更具体地说,当我打算一次提交一个文件时,我同时对大量文件进行了更改。

如何撤消此提交并将我的工作副本恢复到提交之前的状态,这样我就可以做我应该做的事情了?

自提交以来,我没有推或拉或其他任何东西。

你可能怀疑这是重复的,所以我会解释为什么以下问题不同,或者不回答我的问题:

Mercurial undo last commit

对此问题的回答表明,您可以使用hg commit --amend执行此操作,但不解释如何或举例说明这样做。 mercurail帮助也没有为我说明。

How do you "rollback" last commit on Mercurial?

使用hg rollback的国家/地区。这个命令显然已被弃用了,我还是尝试使用它,但是我得到了消息:没有可用的回滚信息。遗憾的是,这并不起作用,因为这将是一种非常直观的方式来实现我想要的目标。

4 个答案:

答案 0 :(得分:40)

基于this question的信息:

hg strip --keep --rev .
--keep: do not modify working directory during strip
--rev .(点表示最后一次提交。阅读sid0关于后代的答案)

对于更熟悉git语言的人,您正在寻找git reset --mixed HEAD^

hard会丢弃您的更改,让您的工作“消失”(我认为这不是一个选项)

soft将撤消提交,但保留以前提交的文件已编入索引(即跟踪)

mixed保留已更改的文件,但告诉索引撤消提交。在git-speak中:git st会说Changes not staged for commit

另请参阅git-reset docsDifference git reset soft/mixedgit/hg Command equivalence table

答案 1 :(得分:25)

好的,我想我已经找到答案了,启用strip扩展程序,并使用以下命令:

hg strip -r -1 --keep

这将从repostiory(-r -1位)删除最后一个修订版,--keep选项表示不对工作副本进行任何更改。因此,您最终会得到一个与提交之前完全相同的工作副本,并且最终没有在存储库中提交。

我不是一个善变的专家,所以请自担风险。

答案 2 :(得分:1)

在这种情况下我要做的是在我考虑删除不良更改集之前创建一个具有我想要的更改的新分支。因此,在这种情况下,我需要在进行错误提交之前返回修订版,重新进行更改,然后进行多次提交,每个文件一次。

一步一步:

1)回到错误提交之前。

% cd <top of repo>
% hg log -l 5
<identify the last good revision>
% hg update -r <last good revision number>

2)重新制作更改:我得到一个描述我想要的更改的补丁,并将其应用到树中。 (我假设小费目前指向我们开始的地方)

% hg diff -r .:tip | patch -p1
patching file a/b/c/d
patching file a/b/e/f

3)进行新的提交:我们现在回到您想要分割的提交之前的状态。执行hg status并查看修改后的文件,确保所有内容都符合您的预期。此时,您可以通过在命令行上命名文件逐个提交文件,或使用recordcrecord等扩展名以交互方式选择它们。

% hg commit a/b/c/d
% hg commit a/b/e/f

...或...

% hg crecord
<select files in UI>
% hg crecord
<select files in UI>

你最终会得到一个如下所示的回购:

o----o----B
      \
       \
        --o----o----o----T

其中B是旧的错误提交,而T是回购的新提示。如果你想让那个分支关闭,所以它不会出现在日志/等中,你可以......

% hg update -r <revision B>
% hg commit --close_branch
% hg update -r tip

如果要完全删除它,可以将其剥离。

% hg strip -r <revision B>

无论哪种方式,您的日志看起来都没有发生过。

答案 3 :(得分:0)

评论和详细阐述@ crobar的帖子原因#字符是不够的。

执行本地提交(无推送)然后运行hg strip -r -1 --keep时,它会删除您之前的提交并保留等待提交的文件列表。基本上这是完全撤消。

如果我在没有hg strip -r -1的情况下使用--keep,它仍会删除您之前的提交但是当我尝试列出要提交的文件时,它无法找到更改,所以我不会&#39 ;建议这样做。

如果我执行提交然后执行推送(到远程)然后执行hg strip -r -1 --keep,它完全按照它应该执行的操作但是当您执行另一次提交然后推送时,它会创建另一个分支。

I.E. 

o----o----Branch (local)
      \
       \
        --o----o----o----Branch (with previous push)

我的来源/参考:测试这些场景