如何从暂存区域中删除单个文件(撤消 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 -- &lt;file&gt;【参考方案2】:

对于较新版本的 Git,有 git restore --staged &lt;file&gt;

当我使用 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 revertgit restoregit 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 &lt;path&gt; 并取消暂存文件,但也可以保留您所做的更改。请记住,如果文件未暂存,您将丢失对它所做的所有更改。

【讨论】:

【参考方案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 directoryindex 视为同一事物。 所以,就像@Tim Henigan's answer,我猜:

您只是想“撤消”为该文件完成的git add

这是我的答案:

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

git reset HEAD <file>

git rm --cached <file>

但是有什么区别呢?

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

git status

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

        deleted:    <file>

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

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

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

git checkout -- &lt;file&gt;

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

【讨论】:

【参考方案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 &lt;file&gt; 为我工作,更改没有受到影响。

【讨论】:

【参考方案8】:
git reset filename.txt

如果您对 filename.txt 进行了修改,则您错误地将其添加到了暂存区,并且您想从暂存区中删除该文件,但又不想丢失所做的更改。

【讨论】:

【参考方案9】:

如果我正确理解了这个问题,您只需“撤消”为该文件完成的git add

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

git reset HEAD -- &lt;file&gt;

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

git reset HEAD -- &lt;directoryName&gt;

您的修改将被保留。当您运行 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 &lt;file&gt;,它奏效了。 -- 是一种分隔符。如果文件名非常规,例如(-fmaster),git 会将其解释为命令行参数或分支名称而不是文件名。 See here 这对我有用,因为没有 -- 没有命令,因为之前没有对该文件的提交。谢谢。【参考方案15】:

git checkout -- &lt;file&gt;

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

【讨论】:

如下所述,这将还原对文件的更改,这比 OP 想要的更进一步。 git rm flie.txt --cached【参考方案16】:

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

见here。

【讨论】:

【参考方案17】:

git reset &lt;file&gt;

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

【讨论】:

【参考方案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)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 git 中取消暂存已删除的文件? [关闭]

git add 后如何撤销暂存的文件?

图解Git命令

如何快速撤消 git 中的暂存和未暂存的更改?

如何撤消 git 中的最后一次提交,但保持我的更改未暂存?

Git从青铜到王者第三篇:Git的基础