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


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

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


968
2017-10-01 19:24


起源


临时区域 是 索引,所以也许你可以准确地澄清你的意思? - CB Bailey
stackoverflow.com/questions/348170/undo-git-add-before-commit - santiagobasulto


答案:


如果我正确理解了这个问题,你只需要“撤消” git add 那是为那个文件做的。

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

git reset HEAD -- <file>

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

git reset HEAD -- <directoryName>

您的修改将被保留。当你跑步 git status 该文件将再次显示为已修改但尚未暂存。

git reset 手册页 详情。


1501
2017-10-01 19:29



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


git rm --cached FILE

git rm -r --cached CVS */CVS

138
2018-05-07 12:25



是的,但最好使用 git reset 在这里,我想,你可以省略--chached选项,并快速使用 git rm命令:-)用 git reset 你是安全的,如果你忘记添加“一些选项”它会保持变化,所以它是“更安全”的日常使用(我在说 git reset --hard)。 - Konrad 'ktoso' Malawski
如果您没有以前的提交,此方法很有用。 - SomeKittens
git rm --cached FILE 暂存文件删除,而不从工作树中删除文件。这与关于撤消的问题不同 git add。 - Sampo Smolander
如果您从工作树中删除了该文件,则此答案将引发错误。 - Samuel Robert
git rm --cached 将导致文件从索引中删除,即文件将成为 未经跟踪 文件。我不认为这是OP想要的。请在此处查看相关主题: stackoverflow.com/questions/45047810/... - smwikipedia


git reset <file>

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


77
2017-08-13 04:20





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

git reset HEAD -- <file>

48
2018-02-21 16:55



什么是 -- 做和为什么添加它?我做到了 git reset HEAD <file> 它工作。 - Paolo
-- 是一种分裂者。如果文件名是非常规的,例如(-f 要么 master)git会将其解释为命令行参数或分支名称而不是文件名。 看这里 - Andrew
这对我来说没有 - 没有 - 因为没有先前提交该文件的命令。谢谢。 - Matthew Swain


git reset filename.txt

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


6
2018-03-20 10:53



这不能解决问题。一旦你有足够的 声誉 你将能够 评论任何帖子;代替, 提供答案,不需要提问者澄清。 - 来自评论 - Tjaart van der Walt
你在说什么?这正确地回答了问题。 - Sjeiti


如果要删除特定模式后使用的文件 git rm --cached,你也可以使用file-glob模式。

看到 这里


5
2018-01-04 09:21





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

git reset -p

要么

git reset -p <file_name>

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


5
2018-02-17 22:13





你要:

  • 影响单个文件

  • 从暂存区域中删除文件

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

  • 不要撤消更改本身

而解决方案是

git reset HEAD file_name.ext

要么

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

2
2017-10-31 09:33





当你这样做 git status,Git告诉你如何取消演示:

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

所以 git reset HEAD <file> 为我工作,变化没有触及。


1
2018-05-08 01:19