如何从git的临时区域中删除单个文件,但不从索引中删除它,或者撤消对文件本身的更改?

How do I remove a single file from the staging area of Git but not remove it from the index or undo the changes to the file itself?

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

问题:如何从临时区域中删除其中一个文件,而不是从索引中删除它,或者撤消对文件本身的更改?


如果我正确理解这个问题,您只需要"撤销"为该文件所做的git add

如果需要从临时区域中删除单个文件,请使用

git reset HEAD --

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

git reset HEAD --

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

详情请参见git reset手册页。


1
git rm --cached FILE

1
git rm -r --cached CVS */CVS


git reset

无论您以前是否有任何承诺,都可以工作。


所以,对TimHenigan的答案稍作调整:您需要在文件名之前使用。如下所示:

1
git reset HEAD -- <file>


1
git reset filename.txt

如果在filename.txt中进行了修改,则错误地将其添加到stage,并且希望从staging中删除该文件,但不希望丢失更改。


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

1
git reset -p

1
git reset -p <file_name>

这个命令基本上与git add -p相反:它只从临时区域中删除所选的更改。我发现它在我错误添加的"无添加"中非常有用。


如果您想删除某个特定模式下的文件,而您使用的是git rm --cached,那么也可以使用文件全局模式。

请看这里。


当你做git status时,git告诉你如何解列:

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

所以,江户十一〔十〕为我工作,变化是不可触及的。


你想要:

  • 影响到单个文件

  • 从临时区域删除文件

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

  • 不要撤消更改本身

解决办法是

1
git reset HEAD file_name.ext

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

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

git add .

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

做一堆也不理想

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

如果你有很多嵌套的目录(大多数项目都是这样),那会很烦人。

这就是GitGUI有用的时候(可能只有在我使用它的时候)。只需打开git-gui,它就会显示分段和未分段的文件部分。从"分段"部分中选择要取消分段的文件,然后按

Ctrl+U (for windows)

把它们拆下来。


我认为你可能对索引的概念感到困惑,正如@cb bailey所评论的:

The staging area is the index.

您可以简单地将临时目录和索引视为相同的事情。所以,就像@tim henigan的答案一样,我猜:

you simply want to"undo" the git add that was done for that file.

这是我的答案:

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

1
git reset HEAD <file>

1
git rm --cached <file>

但是有什么区别呢?

假定该文件已被暂存,并且也存在于工作目录中,如果要将其从暂存目录中删除,请使用git rm --cached ,并将该文件保留在工作目录中。但是请注意,如果使用

1
git status

完成此操作后,您将看到:

1
        deleted:    <file>

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

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

附:我注意到一些答案提到:

git checkout -- strike>

此命令用于文件已暂存,但文件在暂存后已在工作目录中修改的情况,请使用此操作从暂存目录还原工作目录中的文件。换句话说,在这个操作之后,更改发生在工作目录中,而不是临时目录中。


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

1
git reset HEAD .

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


若要立即取消对所有内容的保存,请运行此命令

1
git reset HEAD -- .


git checkout --

从临时区域删除文件非常有效


就我而言,我知道

1
git checkout -- FILE