【发布时间】:2022-03-12 06:22:34
【问题描述】:
假设我在工作目录中做了一些更改,并且不小心将几个文件(包括一些修改过的文件)标记为要删除。如何取消标记要删除的文件而不丢失我所做的更改?
【问题讨论】:
标签: mercurial
假设我在工作目录中做了一些更改,并且不小心将几个文件(包括一些修改过的文件)标记为要删除。如何取消标记要删除的文件而不丢失我所做的更改?
【问题讨论】:
标签: mercurial
只需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
也就是说,不要将--force 与hg remove 一起使用,或者永远不要使用。也试着养成使用hg forget而不是hg remove --after的习惯,
【讨论】:
hg remove [file] 会将文件从文件系统中删除。在这种情况下,hg add [file] 失败,要添加它,您必须执行 hg revert [file]。 hg add [file] 是删除前已修改文件的正确答案。
hg forget 总是一个更好的选择。将删除留给老好(非水银)rm。
Team -> Revert 将恢复旧版本文件并覆盖您的更改。所以你应该在做Revert之前备份你的更改。 (抱歉 - 发现这是在谷歌搜索时放置此信息的最佳位置)
使用hg revert 有两个选项:
hg 还原 -a
这将返回到上一个版本,并将所有更改放入新文件中,并在名称后附加 .orig
hg revert [names of files to unremove] 只恢复那些文件
我可能会选择后者
【讨论】:
hg revert
我很确定 Mercurial 甚至会默认备份您的更改。
【讨论】:
hg mv 间接删除的文件上运行了hg revert。它没有NOT存储我的更改,而是恢复到上次提交的副本。
hg revert 完美地撤消了该更改。
hg add 忘记它们是更好、更容易的解决方法。
如果文件存在,(可能如果您已使用hg forget 将其标记为删除,或者如果您已对其进行了修改,则hg removed ),请使用hg add [file] 将其添加回来,并在之后进行任何更改最后一次提交,在忘记文件之前。
如果文件不存在(可能是文件未修改并且您已使用hg remove 将文件标记为要删除),请执行hg revert [file] 将其恢复到其在工作目录的父级中的状态。
【讨论】:
我遇到了完全相同的问题。 hg add 是 hg forget 的反面(正如相反的情况)。但是,尝试重新添加目录本身不起作用。相反,我不得不在每个文件上使用hg add:
hg st | egrep "^R" | sed -e "s/R //" | xargs hg add
希望对您有所帮助。请注意,在我的情况下,我没有合法地想要删除任何内容。如果您确实有要删除的文件,请相应地调整 grep。
【讨论】:
根据您对 jk 的评论,我检查了 hg forget。它似乎只是hg remove -Af 的捷径,意思是这与hg add 完全相反。
之后,如果您使用过hg remove -Af,那么您应该能够使用hg add 恢复它(我刚刚尝试过,似乎可以使用)。
【讨论】:
标记存储在 .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
最后一个命令应该显示删除文件之前的状态。
【讨论】:
我删除了一堆未修改的文件:
hg remove *
这是我必须做的才能让他们回来:
hg revert --all
没有其他工作。不是hg add 不是hg add * 也不是hg revert *
【讨论】: