2010-02-01 81 views
33

假设我在工作目录中进行了一些更改并意外标记了几个文件(包括一些修改后的文件)以供删除。如何取消删除文件而不会丢失我所做的更改?撤销Mercurial中的移除操作

回答

17

hg revert

我敢肯定水银甚至使得在默认情况下更改备份。

+1

是的,除非你不告诉它,改变放在.orig文件 – 2010-02-01 10:16:30

+1

我刚刚运行'hg恢复'在一个文件我间接删除与'hg mv'。它没有**保存我的更改,并且恢复到上次提交的副本。 – cesar 2011-09-23 02:43:44

+4

这不是正确的答案。恢复改变目录的工作,这个问题是关于如何撤消“删除标记” – 2012-05-11 17:09:15

21

有使用hg revert两个选项:

汞柱恢复-a

这将返回到以前的版本,并把你的新文件中的所有变化与那些.orig追加到名称

hg恢复[删除文件的名称],以恢复这些文件

我可能会去与后者

+0

好吧,我知道恢复。由于我使用了“hg remove -Af”(即在下一次提交中而不是从磁盘中将文件从存储库中删除),我一直在寻找一种解决方案,只取消文件的标记以便保留在存储库中。 “hg revert”也将替换以前的版本。 我预计会有类似于“hg add”/“hg forget”的方式。 “hg forget”只是在下一次提交中将标记为添加的文件取消标记。 – Kostas 2010-02-02 12:00:39

+0

AFAIK恢复是你的唯一选择去除 - 当然删除的帮助说看到恢复删除的东西(而你说的添加建议忘记作为oposite)。你应该得到.orig文件,但是你的更改在 – 2010-02-02 13:04:07

+0

严重。我只是想让它从我不小心“忘记”的文件中删除“删除”标记。我不希望我的文件被修改。 如果我不小心加了,hg忘记解除它。相反是不正确的。如果我忘记一个文件,没有任何数量的hg add'ing会取消标记。 BOOOOOOO TERRIBLE UX。 – 2012-04-04 20:12:08

3

在您对jk的评论中,我检查了hg forget。它似乎只是hg remove -Af的一个快捷方式,这意味着这是hg add的真正对立面。

接下来,如果您使用hg remove -Af,那么您应该能够使用hg add恢复(我刚刚尝试过,似乎工作)。

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 

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

32

只是hg add的文件。

我不知道为什么你会得到一些修改工作目录的答案。如果您不小心标记了一些要删除的文件,则可以使用添加进行撤消。

[email protected]:~/hgtest$ hg status --all 
M another_file 
C a_file 
[email protected]:~/hgtest$ hg remove --after --force * 
[email protected]:~/hgtest$ hg status --all 
R a_file 
R another_file 
[email protected]:~/hgtest$ hg add * 
[email protected]:~/hgtest$ hg status --all 
M another_file 
C a_file 

这就是说,不hg remove或曾经真正使用--force。也试图养成使用hg forget而不是hg remove --after,

+0

很确定这是正确的答案 - 并需要更多upvotes推到顶部。 – slim 2013-02-11 10:43:41

+7

警告:在未经修改的文件上执行'hg remove [file]'将文件从文件系统中移除。在这种情况下,'hg add [file]'失败,并且将其添加回来必须执行'hg revert [file]'。 'hg add [file]'是在删除之前修改过的文件的正确答案。 – dinosaur 2014-10-28 20:15:21

+0

这是真的。这就是为什么'忘记'总是一个更好的选择。将删除保留为旧的(非mercurial)'rm'。 – 2014-10-29 04:21:21

3

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

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

希望有所帮助。请注意,就我而言,我没有任何理由想要删除。如果您有一定要删除的文件,请相应地调整grep。

5

如果该文件存在,(很可能你已经与hg forget标记为删除或者如果已修改它,然后hg remove d吧),做hg add [file]与后最后一次提交之前所做的任何更改将其添加回忘记文件。

如果文件不存在(如果该文件未被修改,并且您使用hg remove标记了要删除的文件),请执行hg revert [file]以将其恢复到其在工作目录父级中的状态。

+1

这个答案远远胜过最受欢迎的答案,因为它解释了为什么以及何时每个命令都可以工作,而不是仅仅放弃一个配方。 – 2015-07-16 08:50:19