如何从暂存区域中删除单个文件(撤消 git add)?
Posted
技术标签:
【中文标题】如何从暂存区域中删除单个文件(撤消 git add)?【英文标题】:How do I remove a single file from the staging area (undo git add)? 【发布时间】:2010-12-03 02:52:23 【问题描述】:情况:我有一个 Git 存储库,其中的文件已经在索引中。我对几个文件进行了更改,打开 Git 并使用“git add”将这些文件添加到我的暂存区。
问题:如何从暂存区域中删除其中一个文件,但不将其从索引中删除或撤消对文件本身的更改?
【问题讨论】:
暂存区是索引,所以也许你可以澄清一下你的意思? ***.com/questions/348170/undo-git-add-before-commit How to undo 'git add' before commit?的可能重复 【参考方案1】:你需要在文件所在目录下,然后在终端输入以下内容
git checkout -- <file>
【讨论】:
这仅在您尝试撤消未暂存文件中的更改时才有效。如果要撤消对阶段文件的更改,您首先需要在运行命令之前git reset HEAD -- <file>
。【参考方案2】:
对于较新版本的 Git,有 git restore --staged <file>
。
当我使用 Git 版本 2.26.2.windows.1
执行 git status
时,也建议取消暂存:
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
(This 帖子显示,在早期版本中,此时建议使用 git reset HEAD
)
我强烈推荐this 发布git revert
、git restore
和git reset
之间的区别以及git restore
的附加参数。
【讨论】:
从 2.23 开始:infoq.com/news/2019/08/git-2-23-switch-restore【参考方案3】:在2.23
版本之后,Git 引入了git restore
命令,您可以使用它来执行此操作。引用官方文档:
使用来自 恢复源。如果路径被跟踪但在还原中不存在 源,它将被删除以匹配源。
该命令还可以用于恢复索引中的内容
--staged
,或者用--staged --worktree
恢复工作树和索引。
因此您可以调用git restore --staged <path>
并取消暂存文件,但也可以保留您所做的更改。请记住,如果文件未暂存,您将丢失对它所做的所有更改。
【讨论】:
【参考方案4】:我的样本:
$ 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)
【讨论】:
【参考方案5】:我认为您可能对 index 的概念感到困惑,例如 @CB Bailey commented:
暂存区是索引。
您可以简单地将 staging directory 和 index 视为同一事物。 所以,就像@Tim Henigan's answer,我猜:
您只是想“撤消”为该文件完成的
git add
。
这是我的答案:
通常,有两种方法可以撤消 stage 操作,正如其他答案已经提到的:
git reset HEAD <file>
和
git rm --cached <file>
但是有什么区别呢?
假设文件已暂存并且也存在于工作目录中,如果您想将其从暂存目录中删除,请使用git rm --cached <file>
,并将文件保存在工作目录中。但请注意,此操作不仅会从 staging 目录 中删除文件,还会在 staging 目录 中将文件标记为deleted
,如果您使用
git status
在这个操作之后,你会看到这个:
deleted: <file>
这是从暂存目录中删除文件的记录。如果您不想保留该记录而只是想撤消文件的前阶段操作,请改用git reset HEAD <file>
。
-------- 答案结束 --------
PS:我注意到提到的一些答案:
git checkout -- <file>
该命令适用于文件已暂存,但暂存后文件在工作目录中被修改的情况,使用该操作恢复暂存目录中的工作目录中的文件。换句话说,在此操作之后,您的工作目录会发生变化,而不是您的暂存目录。
【讨论】:
【参考方案6】:如果您对许多跟踪文件进行了更改,但只想暂存其中的一部分,请执行
git add .
并不总是有利的(或推荐的)- 因为它会暂存所有跟踪的文件(在某些情况下,您只想将更改保留给自己而不希望将它们暂存到远程存储库)。
做一堆也不理想
git add path/to/file1 path/to/file2
如果您有很多嵌套目录(大多数项目都是这种情况)- 会很烦人
这就是 Git GUI 有用的时候(可能只有我使用它的时候)。只需打开 Git GUI,它就会显示暂存和未暂存的文件部分。从暂存部分中选择要取消暂存的文件,然后按
Ctrl+U
(适用于 Windows)
取消暂存它们。
【讨论】:
【参考方案7】:当您执行git status
时,Git 会告诉您如何取消暂存:
Changes to be committed: (use "git reset HEAD <file>..." to unstage).
所以git reset HEAD <file>
为我工作,更改没有受到影响。
【讨论】:
【参考方案8】:git reset filename.txt
如果您对 filename.txt 进行了修改,则您错误地将其添加到了暂存区,并且您想从暂存区中删除该文件,但又不想丢失所做的更改。
【讨论】:
【参考方案9】:如果我正确理解了这个问题,您只需“撤消”为该文件完成的git add
。
如果您需要从暂存区删除单个文件,请使用
git reset HEAD -- <file>
如果您需要从暂存区域中删除整个目录(文件夹),请使用
git reset HEAD -- <directoryName>
您的修改将被保留。当您运行 git status
时,该文件将再次显示为已修改但尚未暂存。
详情请参阅git reset
man page。
【讨论】:
谢谢...我只是注意到在暂存文件上方有说明。我想我一直在看那个屏幕很久了,我有选择地选择我想看的东西。 这将取消我所有的更改,这与我在任何地方(手册页、此处、朋友等)获得的所有建议相反。我一直在想,总有一天它会像宣传的那样做,但不会。 当没有任何对 repo 的提交时,是否可以从暂存中删除文件? 快速提示 @JaredForsyth 尝试 rm -rf .git 如果您的存储库刚刚创建,然后使用 git init 重新创建空存储库,但前提是您的存储库(本地存储库)完全为空而没有任何提交 @Jared Forsyth 要从舞台上删除一个从未提交过的文件,请按照另一个答案的建议使用命令git rm --cached FILE
。【参考方案10】:
你想要:
影响单个文件
从暂存区移除文件
不从索引中删除单个文件
不要撤消更改本身
解决办法是
git reset HEAD file_name.ext
或
git reset HEAD path/to/file/file_name.ext
【讨论】:
【参考方案11】:你需要在文件的目录下,然后在终端输入以下内容
git reset HEAD .
假设您只需要重置一个文件。
【讨论】:
【参考方案12】:如果您只想删除文件更改的子集,可以使用:
git reset -p
或
git reset -p <file_name>
此命令基本上与git add -p
相反:它只会从暂存区域中删除选定的更改。我发现它在“取消添加”我错误添加的内容方面非常有用。
【讨论】:
【参考方案13】:要立即取消暂存所有内容,请运行此命令
git reset HEAD -- .
【讨论】:
之后无法添加文件。【参考方案14】:因此,对 Tim Henigan 的回答稍作调整:您需要在文件名之前使用 -- 。它看起来像这样:
git reset HEAD -- <file>
【讨论】:
--
有什么作用以及为什么要添加它?我做了git reset HEAD <file>
,它奏效了。
--
是一种分隔符。如果文件名非常规,例如(-f
或 master
),git 会将其解释为命令行参数或分支名称而不是文件名。 See here
这对我有用,因为没有 -- 没有命令,因为之前没有对该文件的提交。谢谢。【参考方案15】:
git checkout -- <file>
它可以完美地从暂存区中删除文件
【讨论】:
如下所述,这将还原对文件的更改,这比 OP 想要的更进一步。 git rm flie.txt --cached【参考方案16】:如果你想按照某种模式删除文件并且你正在使用git rm --cached
,你也可以使用 file-glob 模式。
见here。
【讨论】:
【参考方案17】:git reset <file>
无论您以前是否有任何提交,都可以使用。
【讨论】:
【参考方案18】:git rm --cached FILE
,
git rm -r --cached CVS */CVS
【讨论】:
true,但我认为最好在这里使用git reset
,因为您可能会省略 --chached 选项并使用git rm
命令快速感到难过:-) 使用git reset
你'安全起见,如果您忘记添加“某些选项”,它将保留更改,因此对于日常使用来说“更安全”(我说的是git reset --hard
)。
如果您没有以前的提交,此方法很有用。
git rm --cached FILE
阶段文件删除,而不从工作树中删除文件。这与关于撤消 git add
的问题不同。
如果您已从工作树中删除文件,此答案会引发错误。
git rm --cached
将导致文件从索引中删除,即文件将变为 untracked 文件。我认为这不是 OP 想要的。请在此处查看相关主题:***.com/questions/45047810/…以上是关于如何从暂存区域中删除单个文件(撤消 git add)?的主要内容,如果未能解决你的问题,请参考以下文章