如何从暂存区域中删除单个文件(撤消git add)?

情况:我有一个Git存储库,其中的文件已经在索引中。我对几个文件进行更改,打开Git并使用“git add”将这些文件添加到我的暂存区。

提问:如何从暂存区域中删除其中一个文件,但不从索引中删除它或撤消对文件本身的更改?

781490 次浏览

如果我正确理解了这个问题,您只需“撤消”为该文件完成的git add

如果您需要从暂存区域中删除单个文件,请使用

git reset HEAD -- <file>

如果您需要从暂存区域中删除整个目录(文件夹),请使用

git reset HEAD -- <directoryName>

您的修改将被保留。当您运行git status时,文件将再次显示为已修改但尚未暂存。

详情见#0手册页

git rm --cached FILE

,

git rm -r --cached CVS */CVS

git reset <file>

无论您之前是否有任何提交,都有效。

如果您想删除遵循某种模式的文件,并且您使用的是git rm --cached,您也可以使用file-Globb模式。

这里

因此,对Tim Henigan的回答进行了轻微调整:您需要在文件名之前使用--。它看起来像这样:

git reset HEAD -- <file>

git checkout -- <file>

它可以完美地从暂存区删除文件

要立即取消所有操作,请运行此命令

git reset HEAD -- .

如果您只想删除文件更改的子集,您可以使用:

git reset -p

git reset -p <file_name>

这个命令基本上与git add -p相反:它只会从暂存区域中删除选定的更改。我发现它在“取消添加”我错误添加的东西时非常有用。

您需要在文件的目录中,然后在终端中键入以下内容

git reset HEAD .

假设您只需要重置一个文件。

您想要:

  • 影响到单个文件

  • 从暂存区删除文件

  • 不从索引中删除单个文件

  • 不要撤销改变本身

而解决办法是

git reset HEAD file_name.ext

git reset HEAD path/to/file/file_name.ext
git reset filename.txt

如果您在filename.txt中有修改,则错误地将其添加到阶段,并且您想从阶段中删除文件,但您不想丢失更改。

当您执行git status时,Git会告诉您如何取消阶段:

Changes to be committed: (use "git reset HEAD <file>..." to unstage).

所以git reset HEAD <file>对我有用,变化没有被触及。

如果您对许多跟踪文件进行更改,但只想暂存其中的一些文件,请执行

git add .

并不总是有利的(或推荐的)-因为它会暂存所有跟踪的文件(在某些情况下,您只想将更改保留给自己,而不想将它们暂存到远程存储库)。

也不是理想的做一堆

git add path/to/file1 path/to/file2

如果你有很多嵌套目录(大多数项目都是这种情况)-会很烦人

这就是Git GUI有用的时候(可能只有我使用它的时候)。只需打开Git GUI,它就会显示暂存和未暂存的文件部分。从要取消暂存的暂存部分中选择文件并按下

Ctrl+U(Windows)

让他们下台。

我想你可能对索引的概念感到困惑,因为@CB Bailey评论:

暂存区是索引。

您可以简单地将暂存目录索引视为同一件事。
所以,就像@Tim Henigan的回答一样,我猜:

您只是想“撤消”为该文件完成的git add



我的回答是:

通常,有两种方法可以撤消阶段操作,正如其他答案已经提到的那样:

git reset HEAD <file>

git rm --cached <file>

但是有什么区别呢?

假设文件是上演并且也存在于工作目录中,如果您想从暂存目录中删除它,请使用git rm --cached <file>,并将文件保留在工作目录中。但请注意,此操作不仅会从暂存目录中删除文件,还会将文件标记为deleted暂存目录中,如果您使用

git status

执行此操作后,您将看到:

        deleted:    <file>

这是从暂存目录中删除文件的记录。如果您不想保留该记录,只想撤消文件的前一阶段操作,请改用git reset HEAD <file>


-------- 答案 --------

PS:我注意到提到的一些答案:

git checkout -- <file>

此命令适用于文件为上演,但文件在暂存后在工作目录中被修改的情况,使用此操作从暂存目录恢复工作目录中的文件。换句话说,此操作后,更改发生在您的工作目录中,而不是您的暂存目录

我的样本:

$ git statusOn branch feature/wildfire/VNL-425-update-wrong-translationYour branch and 'origin/feature/wildfire/VNL-425-update-wrong-translation' have diverged,and have 4 and 1 different commits each, respectively.(use "git pull" to merge the remote branch into yours)
Changes to be committed:(use "git reset HEAD <file>..." to unstage)
modified:   ShopBack/Source/Date+Extension.swiftmodified:   ShopBack/Source/InboxData.swiftmodified:   ShopBack/en.lproj/Localizable.strings

你们可能注意到了

> Changes to be committed:>       (use "git reset HEAD <file>..." to unstage)

在版本2.23之后,Git引入了git restore命令,您可以使用它来执行此操作。引用官方留档:

使用工作树中的一些内容恢复工作树中的指定路径还原源。如果跟踪了路径但还原中不存在源,它将被删除以匹配源。

该命令也可用于恢复索引中的内容--staged,或者使用--staged --worktree恢复工作树和索引。

因此,您可以调用git restore --staged <path>并取消暂存文件,但也可以保留您所做的更改。请记住,如果文件未暂存,您将丢失对其所做的所有更改。

对于较新版本的Git,有git restore --staged <file>

当我使用Git版本2.26.2.windows.1执行git status时,也建议取消暂存:

Changes to be committed:(use "git restore --staged <file>..." to unstage)

这个帖子显示,在早期版本中,此时推荐git reset HEAD

我强烈推荐这个帖子,解释git revertgit restoregit reset之间的区别,以及git restore的其他参数。

您需要在文件的目录中,然后在终端中键入以下内容

git checkout -- <file>