在Mercurial中撤消删除操作

时间:2010-02-01 09:49:26

标签: mercurial

假设我在工作目录中进行了一些更改,并意外标记了几个文件(包括一些修改过的文件)以供删除。如何在不丢失我所做的更改的情况下取消标记要删除的文件?

7 个答案:

答案 0 :(得分:38)

只需hg add个文件。

我不知道为什么你会得到许多修改工作目录的答案。如果您不小心标记了某些要删除的文件,可以使用add来撤消它。

ry4an@four:~/hgtest$ hg status --all
M another_file
C a_file
ry4an@four:~/hgtest$ hg remove --after --force *
ry4an@four:~/hgtest$ hg status --all
R a_file
R another_file
ry4an@four:~/hgtest$ hg add *
ry4an@four:~/hgtest$ hg status --all
M another_file
C a_file

也就是说,不要将--forcehg remove一起使用,或者永远不要使用hg forget。同时尝试养成使用hg remove --after代替{{1}},

的习惯

答案 1 :(得分:22)

使用hg revert有两个选项:

hg revert -a

将返回上一版本并将所有更改放在名称附加.orig的新文件中

hg还原[要取消删除的文件名称]以恢复这些文件

我可能会选择后者

答案 2 :(得分:16)

hg revert

我非常确定Mercurial默认会备份您的更改。

答案 3 :(得分:6)

如果该文件存在,(可能是您已使用hg forget标记了该文件,或者如果您已将其修改为hg remove d),请执行{{1}使用在最后一次提交之后和忘记文件之前所做的任何更改将其添加回来。

如果该文件不存在(可能是文件未经修改且您已使用hg add [file]标记要删除的文件),请执行hg remove将其恢复为其中的状态工作目录的父级。

答案 4 :(得分:4)

我遇到了完全相同的问题。 hg addhg forget相反(正好相反)。但是,尝试重新添加目录本身不起作用。相反,我必须在每个文件上使用hg add

hg st | egrep "^R" | sed -e "s/R //" | xargs hg add

希望有所帮助。请注意,在我的情况下,我没有合法的删除。如果您有绝对想要删除的文件,请相应地调整grep。

答案 5 :(得分:3)

在您对jk发表评论后,我检查了hg forget。它似乎只是hg remove -Af的捷径,这意味着这是hg add的真正对立面。

在此之后,如果您使用了hg remove -Af,那么您应该可以使用hg add还原它(我只是尝试了它,似乎有效)。

答案 6 :(得分:2)

标记存储在.hg / dirstate文件中。在发出hg remove -Af之前,我需要做的就是获得一个。它可能看起来像这样(未经测试):

hg clone bad-repo orig-repo
cp orig-repo/.hg/dirstate bad-repo/.hg/dirstate
cd bad-repo
hg status

最后一个命令应该在删除文件之前显示状态。