如何从git临时区域删除文件?


547

我对本地存储库中的某些文件进行了更改,然后我做了一些修改git add -A,我认为这将过多的文件添加到暂存区。如何从暂存区删除所有文件?

完成之后,我将手动进行操作git add "filename"


2
:希望你正在寻找这个stackoverflow.com/questions/1505948/...
sumitb.mdi

27
git status已经完全告诉您要取消暂存文件的操作。
Michael Foukarakis

6
@MichaelFoukarakis的git status如果您要取消登台整个目录(如果它用输出淹没了终端(例如node_modules)
则不希望撤消

2
将来,您可能不希望全部添加,而是希望对git add -p或满意git add --patch(它们相同)。该标志使您可以交互地选择要暂存的文件或单个更改-然后可以更精细地了解提交中包含的工作。
加布

Answers:


688

您可以使用以下命令从索引中取消暂存文件

git reset HEAD -- path/to/file

就像一样git add,您可以按目录递归取消文件的顺序,依此类推,因此要立即取消一切,请从存储库的根目录运行:

git reset HEAD -- .

另外,为了将来参考,的输出git status还将告诉您将文件从一种状态转移到另一种状态所需的命令。


5
$ git reset HEAD -- .生产的fatal: Failed to resolve 'HEAD' as a valid ref.注意,我从来没有任何承诺; 它的第一个git addgit init
帕特里齐奥贝尔托尼

5
您也可以使用git reset @
Alex

@alex不仅仅是简单git reset吗?
Antony Hatchkins '16

7
@AntonyHatchkins @是的同义词HEAD
Alex

完全为我工作,谢谢!
wayneseymour

303

采用

git reset

取消所有已暂存的文件。


3
我可以问一下这与git reset HEAD --执行相同操作有何不同吗?
ProNotion

1
@ProNotion重置HEAD默认情况下使用。什么是这些的目的,--在你的git reset HEAD --
安东尼·哈奇金斯

@AntonyHatchkins应该在句号后加上句号(句号),并取自已接受答案中的示例。
ProNotion

11
@ProNotion对不起,我误会了你。git reset HEAD -- .不同之处在于,它仅重置当前目录及以下目录中git reset的文件,而重置项目中的所有文件。
安东尼·哈奇金斯

100

如果您已经提交了许多不需要的文件,则可以取消暂存它们,告诉git将它们标记为已删除(实际上并没有删除它们),

git rm --cached -r .

--cached告诉它从暂存和索引中删除路径,而不删除文件本身,并-r递归地对目录进行操作。然后git add,您可以继续跟踪任何文件。


我想这是“ git rm-”。
亚历山大·米尔斯

1
关于不删除带有“ git rm-”文件的致命错误。
亚历山大·米尔斯

@AlexMills我更新了答案,以提及取消rm所有文件的实际选项。
2014年

2
我在这样的单个文件上尝试了此操作:“ git rm --cached my / file.java”,我看到该文件仍在暂存区中,但已删除!@Max运行此命令时,您的文件实际上是被删除还是未暂存?如果您不寻找这种行为,我会给出答案。
OrwellHindenberg

@OrwellHindenberg感谢您指出这一点!--cached确实是要停止跟踪您已经提交的文件。因此,该文件实际上并未删除,但是git认为确实是删除了。我已经在回答中澄清了这一点。
最多

30

你可以用

git reset HEAD

然后添加所需的特定文件

git add [directory/]filename

您可以添加-x参数,忽略的文件也将被删除。如果您弄乱了.gitignore并在那里有一些有用的东西(例如我的情况),这将非常有用。(git-scm.com/docs/git-clean
Keeprock

1
与多余的文件夹,git status将告诉您工作目录干净 -说谎!git clean -df做了工作,谢谢。
狮子座

5
请注意,这git clean -df将永久删除文件。在类似UNIX的系统上,它将调用,unlink()并且您删除的文件将无法恢复。
汉学2016年

11
OP询问有关取消暂存文件的信息。您建议他删除文件。建议您在回答之前先阅读一下登台区域。
Antony Hatchkins '16

感谢您删除我整个未保存的项目。
Vansuita Jr. '18

7

如其他答案所述,您应该使用git reset。这将撤消的动作git add -A

注意: git reset等同于git reset --mixed这样做

重置索引,但不重置工作树(即,已更改的文件将保留,但未标记为提交),并报告尚未更新的内容。这是默认操作。[ git reset ]


2
..并从临时区域中删除单个文件,您可以执行git reset filenameToNotCommit
SherylHohman

5

现在v2.24.0建议

git restore --staged .

取消暂存文件。


1

您可以通过以下几种方式重置登台区域:

  1. 重置HEAD并添加所有必需的文件以再次检入,如下所示:

     git reset HEAD ---> removes all files from the staging area
     git add <files, that are required to be committed>
     git commit -m "<commit message>"
     git push 
    

是什么使这个答案与现有的六个答案不同?
安东尼·哈奇金斯


1

采用

git reset HEAD

这将从暂存区中删除所有文件


1

如果将不需要的文件添加到暂存区但尚未提交,则只需执行简单的重置即可:

$ git reset HEAD file
# Or everything
$ git reset HEAD .

要仅删除当前工作目录中的未暂存更改,请使用:

git checkout -- .


-3

我尝试了所有这些方法,但没有一个对我有用。我用git的删除文件rm -rf .git形式的本地仓库,然后又做了git initgit add和常规命令。有效。


4
阅读git文档通常比遵循xkcd.com/1597的建议更有意义;)
Antony Hatchkins 18-3-29的

1
也许您在特定情况下遇到了完整性问题,这是剩下的选项,但是不建议这样做。
Shad

请不要这样做,您将销毁整个git repo。
Lennart Rolland

-5

撤消暂存区域中已经存在的文件的最佳方法是 git reset --hard ,可以将暂存的文件恢复原状。现在请小心,这将删除已分阶段和未分阶段的更改。


2
这是错误和危险的!!!OP希望稍后再次“手动添加”文件,但将--hard其永久删除。
安东尼·哈奇金斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.