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

PHL*_*LAK 1177 git version-control staging

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

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

Tim*_*gan 1821

如果我正确理解了这个问题,你只需要"撤消" git add对该文件所做的操作.

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

git reset HEAD -- <file>

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

git reset HEAD -- <directoryName>

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

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

  • 谢谢......我刚刚注意到,这是在分阶段文件上方说明的.猜猜我一直在看那个屏幕,所以我有选择地选择了我想看的东西. (38认同)
  • 无论如何在没有任何提交到repo的时候从暂存中删除文件? (5认同)
  • 我不断来到这个问题.为什么我不能多次投票呢?:) (3认同)
  • 这取消了我所有的变化,与我在任何地方得到的每一条建议相反(手册页,这里,朋友和c).有一天我一直在想它会做什么宣传,但没有. (2认同)
  • @Jared Forsyth要删除一个永远不会从舞台上提交的文件,请使用另一个答案建议的命令`git rm --cached FILE`. (2认同)

小智 146

git rm --cached FILE
Run Code Online (Sandbox Code Playgroud)

,

git rm -r --cached CVS */CVS
Run Code Online (Sandbox Code Playgroud)

  • 是的,但最好在这里使用`git reset`,因为你可以省略--chached选项并快速使用`git rm`命令:-)使用`git reset`你是安全的,如果你忘了添加"某个选项",它会保持变化,所以它对于日常使用来说"更安全"(我说的是`git reset --hard`). (28认同)
  • 如果您没有以前的提交,此方法很有用. (19认同)
  • `git rm --cached`将导致文件从索引中删除,即文件将变为**未跟踪**文件.我不认为这是OP想要的.请在此处查看相关主题:/sf/ask/3153346731/ (3认同)
  • `git rm --cached FILE`暂存文件删除,不删除工作树中的文件.这不同于关于撤消`git add`的问题. (2认同)

MTS*_*MTS 85

git reset <file>

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


Gue*_*erd 53

所以,稍微调整一下Tim Henigan的答案:你需要在文件名之前使用 - .它看起来像这样:

git reset HEAD -- <file>
Run Code Online (Sandbox Code Playgroud)

  • ` - `是一种分隔符.如果文件名是非常规的,例如(`-f`或`master`),git会将其解释为命令行参数或分支名称而不是文件名.[见这里](http://stackoverflow.com/questions/13321458/meaning-of-git-checkout-double-dashes) (15认同)
  • ` - `做什么以及为什么要添加它?我做了`git reset HEAD <file>`它有效. (6认同)
  • 这对我来说没有 - 没有 - 因为没有先前提交该文件的命令.谢谢. (3认同)

小智 16

git reset filename.txt
Run Code Online (Sandbox Code Playgroud)

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


Rui*_*uik 12

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

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

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
Run Code Online (Sandbox Code Playgroud)

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

我强烈推荐这个文章,解释之间的差异git revertgit restore以及git reset对还附加参数git restore


Wul*_*Lee 7

我认为您可能对index的概念感到困惑,正如@CB Bailey 评论的那样:

暂存区就是索引。

您可以简单地将暂存目录索引视为同一事物。所以,就像@Tim Henigan 的回答
一样,我想:

您只想“撤消”git add对该文件所做的操作。



这是我的回答:

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

git reset HEAD <file>
Run Code Online (Sandbox Code Playgroud)

git rm --cached <file>
Run Code Online (Sandbox Code Playgroud)

但有什么区别呢?

假设文件已暂存并且也存在于工作目录中,git rm --cached <file>如果要将其从暂存目录中删除,并将文件保留在工作目录中,请使用。但请注意,如果您使用,此操作不仅会从暂存目录中删除文件,还会将该文件标记为deleted暂存目录中

git status
Run Code Online (Sandbox Code Playgroud)

执行此操作后,您将看到以下内容:

        deleted:    <file>
Run Code Online (Sandbox Code Playgroud)

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


-------- 答案结束 --------

PS:我注意到提到了一些答案:

git checkout -- <file>

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


Mik*_*ike 7

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

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

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

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


new*_*e99 7

我想你可以去

git restore --staged <path/to/file_name>


fed*_*024 6

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

git reset -p
Run Code Online (Sandbox Code Playgroud)

要么

git reset -p <file_name>
Run Code Online (Sandbox Code Playgroud)

此命令基本上是相反的git add -p:它只会从暂存区域中删除所选的更改.我发现在"取消添加"我错误添加的内容时非常有用.