【问题标题】:Undo a remove action in Mercurial在 Mercurial 中撤消删除操作
【发布时间】:2022-03-12 06:22:34
【问题描述】:

假设我在工作目录中做了一些更改,并且不小心将几个文件(包括一些修改过的文件)标记为要删除。如何取消标记要删除的文件而不丢失我所做的更改?

【问题讨论】:

    标签: mercurial


    【解决方案1】:

    只需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的习惯,

    【讨论】:

    • 很确定这是正确的答案 - 并且需要更多的支持才能被推到顶部。
    • 警告:对未修改的文件执行hg remove [file] 会将文件从文件系统中删除。在这种情况下,hg add [file] 失败,要添加它,您必须执行 hg revert [file]hg add [file] 是删除前已修改文件的正确答案。
    • 这是真的。这就是为什么hg forget 总是一个更好的选择。将删除留给老好(非水银)rm
    • 如果使用带有 Mercurial 的 Eclipse(例如通过 MercurialEclipse 插件),那么如果您想将文件更改保留在标记为的文件上删除(由于之前的待撤消工作目录更改/尚未提交,但您会看到一个红叉)然后使用 Team -> Revert 将恢复旧版本文件并覆盖您的更改。所以你应该在做Revert之前备份你的更改(抱歉 - 发现这是在谷歌搜索时放置此信息的最佳位置)
    【解决方案2】:

    使用hg revert 有两个选项:

    hg 还原 -a

    这将返回到上一个版本,并将所有更改放入新文件中,并在名称后附加 .orig

    hg revert [names of files to unremove] 只恢复那些文件

    我可能会选择后者

    【讨论】:

    • 好的,我知道还原。由于我使用了“hg remove -Af”(即在下一次提交中从存储库中删除文件,而不是从磁盘中删除),我一直在寻找一种解决方案,它只会取消标记文件以便保留在存储库中。 “hg revert”也将用以前的版本替换它们。我预计会有一种类似于“hg add”/“hg forget”的方法。 “hg forget” 只是取消标记标记为在下一次提交中添加的文件。
    • AFAIK revert 是您取消删除的唯一选择-当然,remove 的帮助说要查看未删除的东西的revert(而正如您所说的那样,add 建议忘记作为对立面)。但是,您应该获得带有更改的 .orig 文件
    • 说真的。我只是希望它从我不小心“忘记”的一些文件中删除“删除”标记。我不想修改我的文件。如果我不小心添加了 hg,hg forget 会撤消它。反过来是不正确的。如果我忘记了一个文件,没有多少 hg add'ing 会取消标记它。糟糕的用户体验。
    【解决方案3】:

    hg revert

    我很确定 Mercurial 甚至会默认备份您的更改。

    【讨论】:

    • 是的,除非您告诉它不要这样做,否则更改会放在 .orig 文件中
    • 我刚刚在使用hg mv 间接删除的文件上运行了hg revert。它没有NOT存储我的更改,而是恢复到上次提交的副本。
    • 不是正确答案。 Revert 改变了工作目录,这个问题是关于如何撤消“删除标记”
    • @Ry4an:我标记了要删除的文件,hg revert 完美地撤消了该更改。
    • 是的,但是 revert 错过了“不丢失我所做的更改”部分。如果您同时编辑了一个文件,并将其标记为删除(“hg forget FILENAME”),那么 revert 将撤消这两个更改。用hg add 忘记它们是更好、更容易的解决方法。
    【解决方案4】:

    如果文件存在,(可能如果您已使用hg forget 将其标记为删除,或者如果您已对其进行了修改,则hg removed ),请使用hg add [file] 将其添加回来,并在之后进行任何更改最后一次提交,在忘记文件之前。

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

    【讨论】:

    • 这个答案比投票最多的答案要好得多,因为它解释了每个命令为什么以及何时起作用,而不是仅仅给出一个食谱。
    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案6】:

      根据您对 jk 的评论,我检查了 hg forget。它似乎只是hg remove -Af 的捷径,意思是这与hg add 完全相反。

      之后,如果您使用过hg remove -Af,那么您应该能够使用hg add 恢复它(我刚刚尝试过,似乎可以使用)。

      【讨论】:

        【解决方案7】:

        标记存储在 .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
        

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

        【讨论】:

          【解决方案8】:

          我删除了一堆未修改的文件:

          hg remove *
          

          这是我必须做的才能让他们回来:

          hg revert --all
          

          没有其他工作。不是hg add 不是hg add * 也不是hg revert *

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-05
            • 2010-09-17
            • 2012-03-17
            • 2011-03-10
            相关资源
            最近更新 更多