情况:我有一个Git存储库,索引中已经有文件。我修改了几个文件,打开Git,用“Git add”把这些文件添加到我的暂存区。

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


如果我理解正确,您只是想“撤消”为该文件所做的git添加。

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

git重置HEAD—<文件>

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

git重置HEAD——<directoryName> . txt

我们将保留您的修改。当您运行git status时,文件将再次显示为已修改但尚未登台。

详见git重置手册页。


git rm --cached FILE

,

git rm -r --cached CVS */CVS

Git重置<文件>

无论您是否有任何以前的提交。


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

在这里看到的。


所以,对Tim Henigan的回答做一个小小的调整:你需要在文件名之前使用——。它看起来是这样的:

git reset HEAD -- <file>

Git checkout——<文件>

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


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

git reset HEAD -- .

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

git reset -p

or

git reset -p <file_name>

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


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

git reset HEAD .

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


你想要的:

影响到单个文件 从暂存区删除文件 不能从索引中删除单个文件 不要撤消更改本身

答案是

git reset HEAD file_name.ext

or

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

git reset filename.txt

如果在filename.txt中有修改,则是您错误地将其添加到stage,并且希望从staging中删除该文件,但又不想丢失所做的更改。


当你执行git status时,git会告诉你如何取消运行:

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

所以git重置HEAD <文件>为我工作,这些变化没有被触及。


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

转到添加 。

并不总是有利的(或推荐的)——因为它会阶段性地跟踪所有的文件(在某些情况下,您希望仅将更改保留给自己,而不希望将它们阶段性地转移到远程存储库)。

做一堆也不理想

git add路径/to/file1路径/to/file2

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

这就是Git GUI有帮助的时候(可能是我唯一一次使用它)。只要打开Git GUI,它就会显示阶段性和非阶段性文件部分。从要取消staging的部分中选择文件并按下

Ctrl+U (windows)

让他们退出舞台。


我想你可能对索引的概念感到困惑,就像@CB Bailey评论的那样:

暂存区域是索引。

您可以简单地将暂存目录和索引看作是一回事。 所以,就像@Tim Henigan的回答一样,我想:

您只需“撤消”为该文件所做的git添加。

以下是我的回答:

通常,有两种方法来撤销一个阶段操作,正如前面提到的其他答案:

git reset HEAD <file>

and

git rm --cached <file>

但是有什么区别呢?

假设文件已经被暂存,并且存在于工作目录中,如果你想将它从暂存目录中删除,请使用git rm——cached <file>,并将文件保留在工作目录中。但是请注意,该操作不仅将从暂存目录中删除该文件,而且还将该文件标记为在暂存目录中已删除

git status

在这个操作之后,你会看到:

        deleted:    <file>

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

--------结束回答--------

PS:我注意到了一些回答:

Git checkout——<文件>

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


我的示例:

$ 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)

在2.23版本之后,Git引入了Git恢复命令,你可以使用它来恢复。引用官方文件:

类中的某些内容恢复工作树中的指定路径 恢复源。如果跟踪的路径在恢复中不存在 源,它将被删除以匹配源。 该命令还可以用于恢复索引中的内容 ——staging,或者使用——staging——worktree恢复工作树和索引。

因此,您可以调用git restore——staging <path>并取消该文件,但同时保留所做的更改。请记住,如果文件没有暂存,则会丢失对其所做的所有更改。


对于新版本的Git,有Git restore——staging <file>。

当我用git 2.26.2.windows做git状态时。1 .也建议用于取消分期:

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

(这篇文章显示,在早期版本git重置HEAD在这一点上是推荐的)

我强烈推荐这篇文章,解释了git恢复、git恢复和git重置之间的区别,以及git恢复的附加参数。


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

git checkout -- <file>

我想你可以选

Git恢复——staging <path/to/file_name>