撤销“git add <dir>”命令?

238

我错误地使用命令"git add dir"添加了文件。 我还没有运行"git commit"。 有没有办法从提交中删除这个目录及其中包含的所有内容?

我尝试过git reset dir,但它没有起作用。 显然git reset file是撤消操作的正确方式。 但是我有很多文件,时间很少。


8
git reset <path> 命令会更新该路径下的索引(index),使其与当前提交的代码版本 HEAD 一致,但不会影响工作区(working tree)。 - Cascabel
5个回答

350
从索引中删除一个目录及其所有内容,
git rm --cached -r dir

--cached选项使git rm仅对索引操作,不涉及工作副本。-r选项使其递归执行。


15
“从索引中删除整个暂存目录”可能是Git命令的更好解释,因为对于像我这样的Git初学者来说,该命令看起来很像它甚至可以删除文件系统上的目录。这只是品味问题。 - Sascha Gottfried
3
这就是为什么我加粗了“--cached”开关。但是,我已经编辑了答案,以说明它仅适用于索引。 - Aristotle Pagaltzis
@SaschaGottfried 谢谢你的澄清,一开始我还有点害怕,但是你的评论让事情变得清晰明了 :) - Max von Hippel
我差点删除了整个文件夹:S 在此之后...执行 git reset HEAD folder 修复了一切...但在执行此操作之前,请执行 git status folder,确保它说它已经 '删除' 了该文件夹中的所有文件。 - pr00thmatic

45

您需要使用git rm --cached -r <dir>命令,该命令将从索引中删除已暂存的目录内容。

如果目录已经被跟踪,则必须手动查找新旧文件并取消暂存...

然后可能要运行git reset <dir>来重置目录内现有(已跟踪)的文件。


更新于2019年:

只需运行git reset directory,它将取消暂存所有新添加的文件。


1
git reset <dir> 单独执行不够吗? - Bananach
@Bananach 我刚试了一下,似乎 git reset <dir> 也可以。这个答案是从2011年的,所以我不确定8年前是否已经可行。我会更新答案。谢谢你的提示! - knittl

26

取消暂存目录

$ git reset <dir>

取消我之前使用以下命令暂存的所有文件和文件夹:

$ git add <dir>

确认目录未暂存

为了确认从暂存区(即“将要提交的更改”)中移除目录及其内容,请运行以下命令:

$ git status
或者
$ git diff --staged --name-only 
确认之前暂存的文件或文件夹是否已经全部取消暂存。

11

使用findxargs

find dir -type f | xargs git reset

4

一个简单的命令可以移除暂存但尚未提交的文件/文件夹,即 - git restore --staged <dir>

enter image description here


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