从Git的“已更改但未更新”的文件中删除所有已删除的文件

22

当我运行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 命令来移除这些文件。你想要将这些文件恢复到你的工作目录中,还是彻底从索引和工作目录中移除它们? - CB Bailey
我想将它们从索引中删除,这就是 git checkout -- [filename] 所做的,而 git checkout [filename] 则恢复文件。 - Trevor Burnham
很抱歉,这是不正确的 - git checkout -- <filename> 中的 -- 只是一种确保 <filename> 被解释为路径而不是分支名称(或标签或提交)的方法。如果 <filename> 不是分支名称等,则您提到的两种形式具有相同的效果:将文件恢复到索引中的状态。 - Mark Longair
啊,糟糕!谢谢你的纠正,马克。 - Trevor Burnham
“Discard changes” 的意思是 “撤消我在工作目录中所做的更改”。您正在放弃自上次提交状态以来所做的更改。删除文件是一种更改,因此检出将通过恢复文件来丢弃该更改。 - cdhowie
3个回答

37

正如rampion所指出的,你仍然可以使用git rm来将已经被删除但还未更新到版本库中的文件暂存(例如,在你的情况下,只需运行git rm dir/file.js即可)。如果有很多这样的文件在“更改但未更新”下列出为“已删除:”,我建议先检查git ls-files --deleted是否会列出这些文件,如果是的话,就用以下命令将它们删除:

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

36

所以,你想要提交删除那些文件吗? 然后使用

git add -u
git commit

2
只是为了澄清我为什么更喜欢我添加的答案,git add -u 在这种情况下的问题在于它还会将存储库中已跟踪文件的任何其他更改暂存,而不仅仅是删除。 - Mark Longair
来自Dialogik的编辑被拒绝:(请注意,这也会将存储库中跟踪文件的任何其他更改暂存,而不仅仅是删除-请参见下面的注释。) - Jeremy Thompson

1

即使事后你仍然可以使用git rm,但如果需要的话,你可以使用git reset --hard将所有更改的文件(包括删除的文件)恢复到上一个版本。


我在使用 git push 时遇到了问题,它卡在了一个已删除的大文件上,我尝试了以上所有方法,但状态日志中没有显示该文件。但是它仍然卡在了推送上。如果我继续使用 git rm 命令,您的答案能解决这个问题吗? - elliotrock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接