【发布时间】:2010-12-03 02:52:23
【问题描述】:
情况:我有一个 Git 存储库,其中的文件已经在索引中。我对几个文件进行了更改,打开 Git 并使用“git add”将这些文件添加到我的暂存区。
问题:如何从暂存区域中删除其中一个文件,但不将其从索引中删除或撤消对文件本身的更改?
【问题讨论】:
-
暂存区是索引,所以也许你可以澄清一下你的意思?
标签: git version-control staging
情况:我有一个 Git 存储库,其中的文件已经在索引中。我对几个文件进行了更改,打开 Git 并使用“git add”将这些文件添加到我的暂存区。
问题:如何从暂存区域中删除其中一个文件,但不将其从索引中删除或撤消对文件本身的更改?
【问题讨论】:
标签: git version-control staging
你需要在文件所在目录下,然后在终端输入以下内容
git checkout -- <file>
【讨论】:
git reset HEAD -- <file>。
【讨论】:
在2.23 版本之后,Git 引入了git restore 命令,您可以使用它来执行此操作。引用官方文档:
使用来自 恢复源。如果路径被跟踪但在还原中不存在 源,它将被删除以匹配源。
该命令还可以用于恢复索引中的内容
--staged,或者使用--staged --worktree恢复工作树和索引。
因此您可以调用git restore --staged <path> 并取消暂存文件,但也可以保留您所做的更改。请记住,如果文件未暂存,您将丢失对它所做的所有更改。
【讨论】:
我的样本:
$ 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)
【讨论】:
我认为您可能对 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>
该命令适用于文件已暂存,但暂存后文件在工作目录中被修改的情况,使用该操作恢复暂存目录中的工作目录中的文件。换句话说,在此操作之后,您的工作目录会发生变化,而不是您的暂存目录。
【讨论】:
如果您对许多跟踪文件进行了更改,但只想暂存其中的一部分,请执行
git add .
并不总是有利的(或推荐的)- 因为它会暂存所有跟踪的文件(在某些情况下,您只想将更改保留给自己而不希望将它们暂存到远程存储库)。
做一堆也不理想
git add path/to/file1 path/to/file2
如果您有很多嵌套目录(大多数项目都是这种情况)- 会很烦人
这就是 Git GUI 有用的时候(可能只有我使用它的时候)。只需打开 Git GUI,它就会显示暂存和未暂存的文件部分。从暂存部分中选择要取消暂存的文件,然后按
Ctrl+U(适用于 Windows)
取消暂存它们。
【讨论】:
当您执行git status 时,Git 会告诉您如何取消暂存:
Changes to be committed: (use "git reset HEAD <file>..." to unstage).
所以git reset HEAD <file> 为我工作,更改没有受到影响。
【讨论】:
git reset filename.txt
如果您对 filename.txt 进行了修改,则您错误地将其添加到了暂存区,并且您想从暂存区中删除该文件,但又不想丢失所做的更改。
【讨论】:
如果我正确理解了这个问题,您只需“撤消”为该文件完成的git add。
如果您需要从暂存区删除单个文件,请使用
git reset HEAD -- <file>
如果您需要从暂存区删除整个目录(文件夹),请使用
git reset HEAD -- <directoryName>
您的修改将被保留。当您运行 git status 时,该文件将再次显示为已修改但尚未暂存。
详情请参阅git reset man page。
【讨论】:
git rm --cached FILE。
你想要:
影响单个文件
从暂存区移除文件
不从索引中删除单个文件
不要撤消更改本身
解决办法是
git reset HEAD file_name.ext
或
git reset HEAD path/to/file/file_name.ext
【讨论】:
你需要在文件的目录下,然后在终端输入以下内容
git reset HEAD .
假设您只需要重置一个文件。
【讨论】:
如果您只想删除文件更改的子集,可以使用:
git reset -p
或
git reset -p <file_name>
此命令基本上与git add -p 相反:它只会从暂存区域中删除选定的更改。我发现它在“取消添加”我错误添加的内容方面非常有用。
【讨论】:
要立即取消暂存所有内容,请运行此命令
git reset HEAD -- .
【讨论】:
因此,对 Tim Henigan 的回答稍作调整:您需要在文件名之前使用 -- 。它看起来像这样:
git reset HEAD -- <file>
【讨论】:
-- 有什么作用以及为什么要添加它?我做了git reset HEAD <file>,它奏效了。
-- 是一种分隔符。如果文件名非常规,例如(-f 或 master),git 会将其解释为命令行参数或分支名称而不是文件名。 See here
git checkout -- <file>
它可以完美地从暂存区中删除文件
【讨论】:
如果你想按照某种模式删除文件并且你正在使用git rm --cached,你也可以使用文件全局模式。
见here。
【讨论】:
git reset <file>
无论您以前是否有任何提交,都可以使用。
【讨论】:
git rm --cached FILE
,
git rm -r --cached CVS */CVS
【讨论】:
git reset,因为您可能会省略 --chached 选项并使用git rm 命令快速感到难过:-) 使用git reset 你'安全起见,如果您忘记添加“某些选项”,它将保留更改,因此对于日常使用来说“更安全”(我说的是git reset --hard)。
git rm --cached FILE 阶段文件删除,而不从工作树中删除文件。这与关于撤消 git add 的问题不同。
git rm --cached 将导致文件从索引中删除,即文件将变为 untracked 文件。我认为这不是 OP 想要的。请在此处查看相关主题:stackoverflow.com/questions/45047810/…