【问题标题】:Remove all deleted files from "changed but not updated" in Git从 Git 中的“已更改但未更新”中删除所有已删除的文件
【发布时间】:2011-03-11 07:58:42
【问题描述】:

当我运行git status 时,我有一堆表单行

deleted:    dir/file.js

我可以使用git checkout -- dir/file.js 单独删除其中的每一个,但必须有一种不那么费力的方法。 (是的,我知道我应该首先使用git rm...)

[更新:正如 Mark 在下面指出的那样,git checkout -- 实际上恢复了一个已删除的文件,而我认为它从 git 索引中删除了它。我有点困惑,因为当你运行git status 时,它会说:

use "git checkout -- <file>..." to discard changes in working directory

对我来说,“放弃更改”并不意味着“恢复您删除的文件”,但在 git 术语中我认为这是有道理的。]

【问题讨论】:

  • 我不明白。 checkout 将恢复这些已删除的文件,但您说您应该首先使用 git rm 来删除这些文件。您要将这些文件恢复到您的工作树还是从索引和工作树中删除它们?
  • 我也想将它们从索引中删除,这是 git checkout -- [filename] 所做的,而 git checkout [filename] 会恢复文件。
  • 这不对,我担心 - git checkout -- &lt;filename&gt; 中的 -- 只是一种确保 &lt;filename&gt; 被解释为路径而不是分支名称(或标签或提交)。如果&lt;filename&gt; 不是分支的名称(&c.),那么您提到的两种形式都具有相同的效果:它们将文件恢复到索引中的状态。
  • 啊,哎呀!谢谢你的更正,马克。
  • “放弃更改”的意思是“撤消我在工作目录中所做的事情”。您正在丢弃自上次提交状态以来所做的更改。删除文件是一种更改,ergo checkout 将通过恢复文件来丢弃该更改。

标签: git


【解决方案1】:

正如 rampion 指出的那样,您仍然可以使用 git rm 暂缓删除工作副本中已删除的文件(例如,在您的情况下仅使用 git rm dir/file.js。)如果您列出了很多这些文件作为“已更改但未更新”下的“已删除:”,我将首先检查 git ls-files --deleted 是否生成了这些文件的列表,如果是,请使用以下命令删除它们:

git ls-files --deleted -z | xargs -0 git rm

【讨论】:

    【解决方案2】:

    那么,您要提交删除这些文件吗? 然后使用

    git add -u
    git commit
    

    【讨论】:

    • 只是为了澄清为什么我更喜欢我添加的答案,在这种情况下git add -u 的问题是它还会对存储库中的跟踪文件进行任何其他更改,而不仅仅是删除.
    • Rejected Edit from Dialogik:(请注意,这也会暂存对存储库中跟踪文件的任何其他更改,而不仅仅是删除 - 请参阅下面的 cmets。)
    【解决方案3】:

    事后您仍然可以git rm,但如果您愿意,您可以使用git reset --hard将所有更改的文件(包括删除)恢复到最新版本

    【讨论】:

    • 我有一个问题,git push 挂在一个已删除的大文件上,遵循以上所有内容等等。它没有显示在任何状态日志中。但它仍然悬而未决。如果我之后继续使用git rm,你的回答会解决这个问题吗?
    猜你喜欢
    • 2014-09-06
    • 2013-10-02
    • 2012-07-09
    • 1970-01-01
    • 2012-12-05
    • 2017-01-02
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多