1365

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

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

4

18 回答 18

2066

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

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

git reset HEAD -- <file>

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

git reset HEAD -- <directoryName>

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

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

于 2009-10-01T19:29:08.247 回答
163
git rm --cached FILE

,

git rm -r --cached CVS */CVS
于 2010-05-07T12:25:09.293 回答
102

git reset <file>

无论您以前是否有任何提交,都可以使用。

于 2013-08-13T04:20:46.353 回答
55

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

git reset HEAD -- <file>
于 2014-02-21T16:55:24.350 回答
23
git reset filename.txt

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

于 2018-03-20T10:53:55.333 回答
15

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

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

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

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

我强烈推荐这篇文章,解释 . 之间的差异git revertgit restore以及.git resetgit restore

于 2020-05-11T08:35:14.197 回答
7

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

git reset -p

或者

git reset -p <file_name>

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

于 2017-02-17T22:13:23.343 回答
5

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

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

于 2019-02-22T03:03:17.543 回答
4

如果你想按照某种模式删除文件并且你正在使用git rm --cached,你也可以使用 file-glob 模式。

这里

于 2014-01-04T09:21:44.150 回答
4

在 version 之后2.23,Git 引入了git restore您可以用来执行此操作的命令。引用官方文档:

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

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

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

于 2020-03-30T10:50:34.293 回答
3

当你这样做时git status,Git 会告诉你如何取消暂存:

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

所以git reset HEAD <file>对我有用,变化没有受到影响。

于 2018-05-08T01:19:09.303 回答
2

你要:

  • 影响单个文件

  • 从暂存区删除文件

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

  • 不要撤消更改本身

解决方案是

git reset HEAD file_name.ext

或者

git reset HEAD path/to/file/file_name.ext
于 2017-10-31T09:33:53.270 回答
1

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

git add .

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

也不是理想的做一堆

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

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

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

Ctrl+U(用于窗户)

取消舞台。

于 2018-08-10T22:29:32.287 回答
1

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

git checkout -- <file>
于 2020-12-06T20:42:39.837 回答
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)
于 2019-10-29T04:23:49.570 回答
-1

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

git reset HEAD .

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

于 2017-09-26T19:51:31.287 回答
-4

要一次取消暂存所有内容,请运行此命令

git reset HEAD -- .
于 2016-09-06T19:03:38.363 回答
-9

git checkout -- <file>

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

于 2015-05-18T17:25:05.850 回答