如何从登台区域删除单个文件(撤消git add)?


1229

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

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


40
暂存区索引,因此也许您可以确切说明您的意思?
CB Bailey 2009年


Answers:


1901

如果我正确理解了这个问题,您只是想“撤消” git add对该文件所做的操作。

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

git reset HEAD -- <file>

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

git reset HEAD -- <directoryName>

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

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


41
谢谢...我刚刚注意到,这是在暂存文件上方说的。猜猜我一直在看那个屏幕很久,我有选择地选择了我想看的东西。
PHLAK

2
与我在任何地方(手册页,此处,朋友及其他地方)得到的每条建议相反,这使我的所有更改失去了作用。我一直在想,有一天它将做广告宣传,但是没有。
rektide

6
在没有任何回购提交的情况下,是否可以从暂存中删除文件?
贾里德·福赛斯

3
我一直来问这个问题。为什么我不能再投票几次?:)
Puce

3
@Jared Forsyth要删除从未从舞台上提交的文件,请使用git rm --cached FILE另一个答案建议的命令。
chmike

150
git rm --cached FILE

git rm -r --cached CVS */CVS

28
是的,但是git reset我认为最好在这里使用,因为您可能会省略--chached选项,并使用以下git rm命令快速感到沮丧:-) git reset为了安全起见,如果您忘记添加“某些选项”,它将保留更改,以使其在日常使用中“更安全”(我在说git reset --hard)。
2011年

20
如果您没有以前的提交,则此方法很有用。
SomeKittens

2
git rm --cached FILE分阶段删除文件,而不删除工作树中的文件。这与关于撤消的问题不同git add
Sampo Smolander 2015年

1
如果您已从工作树中删除文件,此答案将引发错误。
塞缪尔·罗伯

3
git rm --cached将导致文件从索引中删除,即该文件将成为未跟踪的文件。我认为这不是OP想要的。请参阅相关的线程在这里:stackoverflow.com/questions/45047810/...
smwikipedia

88

git reset <file>

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


53

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

git reset HEAD -- <file>

6
什么是--做和为什么增加吗?我做到了git reset HEAD <file>,它奏效了。
Paolo

15
--是一种分隔线。如果文件名是非常规的,例如git -fmastergit会将其解释为命令行参数或分支名称,而不是文件名。看到这里
Andrew

3
这对我有用,而没有-命令的原因不是因为该文件之前没有提交。谢谢。
马特2014年

17
git reset filename.txt

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


6

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

git reset -p

要么

git reset -p <file_name>

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


4

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

这里


2

你要:

  • 影响单个文件

  • 从临时区域删除文件

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

  • 不要撤消更改本身

解决方案是

git reset HEAD file_name.ext

要么

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

2

完成后git status,Git会告诉您如何取消登台:

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

如此git reset HEAD <file>为我工作,而变化未受影响。


2

我想您可能对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>

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


2

在版本之后2.23,Git引入了git restore可用于执行此命令的命令。引用官方文档:

使用还原源中的某些内容还原工作树中的指定路径。如果跟踪了路径但在还原源中不存在,则会将其删除以匹配该源。

该命令还可以用于使用还原索引中的内容 --staged,或使用还原工作树和索引--staged --worktree

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


1

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

git add .

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

做一堆也不理想

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

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

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

Ctrl+U (对于Windows)

使他们下台。


1

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

当我对git statusGit版本进行处理时2.26.2.windows.1,也建议您进行暂存:

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

这篇文章显示,git reset HEAD此时建议使用早期版本)

我可以强烈推荐这篇文章,说明之间的区别git revertgit restore以及的git reset其他参数git restore


0

我的样本:

$ git status
On branch feature/wildfire/VNL-425-update-wrong-translation
Your 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.swift
    modified:   ShopBack/Source/InboxData.swift
    modified:   ShopBack/en.lproj/Localizable.strings

您可能会注意到

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

-1

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

git reset HEAD .

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




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.