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

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

问题:如何从登台区域中删除这些文件之一,而不从索引中删除它或撤消对文件本身的更改?

答案

如果我正确理解了这个问题,则只想 “撤消” 对该文件执行的git add

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

git reset HEAD -- <file>

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

git reset HEAD -- <directoryName>

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

有关详细信息,请参见git reset手册页

git rm --cached FILE

git rm -r --cached CVS */CVS

git reset <file>

无论您是否有以前的提交都可以工作。

因此,对蒂姆 · 海尼根(Tim Henigan)的答案做了些微调整:您需要在文件名之前使用 -。它看起来像这样:

git reset HEAD -- <file>
git reset filename.txt

如果您在 filename.txt 中进行了修改,则误将其添加到了阶段,并且希望从暂存中删除该文件,但是您不想丢失所做的更改。

如果您只想删除文件更改的一部分,则可以使用:

git reset -p

要么

git reset -p <file_name>

此命令基本上与git add -p相反:它将仅从登台区域中删除选定的更改。我发现它在 “阻止” 我错误添加的内容中非常有用。

如果要删除遵循特定模式的文件,并且正在使用git rm --cached ,则也可以使用 file-glob 模式。

这里

你要:

  • 影响单个文件

  • 从临时区域删除文件

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

  • 不要撤消更改本身

解决方案是

git reset HEAD file_name.ext

要么

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

当您执行git status ,Git 会告诉您如何取消登台:

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

所以git reset HEAD <file>对我有用,而且更改没有被修改。

我想您可能对index的概念感到困惑,正如@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>

此命令适用于暂存文件但暂存后在工作目录中对其进行了修改的情况,请使用此操作从暂存目录恢复工作目录中的文件。换句话说,执行此操作后,更改将在您的工作目录中发生,而不是在登台目录中发生