情况:我有一个 Git 存储库,其中的文件已经在索引中。我对几个文件进行了更改,打开 Git 并使用“git add”将这些文件添加到我的暂存区。
问题:如何从暂存区域中删除其中一个文件,但不将其从索引中删除或撤消对文件本身的更改?
情况:我有一个 Git 存储库,其中的文件已经在索引中。我对几个文件进行了更改,打开 Git 并使用“git add”将这些文件添加到我的暂存区。
问题:如何从暂存区域中删除其中一个文件,但不将其从索引中删除或撤消对文件本身的更改?
如果我正确理解了这个问题,您只需“撤消”git add
为该文件所做的操作。
如果您需要从暂存区域中删除单个文件,请使用
git reset HEAD -- <file>
如果您需要从暂存区域中删除整个目录(文件夹) ,请使用
git reset HEAD -- <directoryName>
您的修改将被保留。当您运行git status
该文件时,该文件将再次显示为已修改但尚未暂存。
有关详细信息,请参见git reset
手册页。
git rm --cached FILE
,
git rm -r --cached CVS */CVS
git reset <file>
无论您以前是否有任何提交,都可以使用。
因此,对 Tim Henigan 的回答稍作调整:您需要在文件名之前使用 -- 。它看起来像这样:
git reset HEAD -- <file>
git reset filename.txt
如果您在 filename.txt 中进行了修改,则您错误地将其添加到了暂存区,并且您想从暂存区中删除该文件,但您不想丢失所做的更改。
如果您只想删除文件更改的子集,可以使用:
git reset -p
或者
git reset -p <file_name>
这个命令基本上是相反的git add -p
:它只会从暂存区域中删除选定的更改。我发现它在“取消添加”我错误添加的内容方面非常有用。
我认为您可能对index的概念感到困惑,正如@CB Bailey 评论的那样:
暂存区是索引。
您可以简单地将暂存目录和索引视为同一事物。
所以,就像@Tim Henigan 的回答一样,我猜:
您只是想“撤消”
git add
为该文件所做的操作。
这是我的答案:
通常,有两种方法可以撤消阶段操作,正如已经提到的其他答案:
git reset HEAD <file>
和
git rm --cached <file>
但是有什么区别呢?
假设文件已经暂存并且也存在于工作目录中,git rm --cached <file>
如果要从暂存目录中删除它,请使用,并将文件保留在工作目录中。但请注意,此操作不仅会从暂存目录中删除文件,还会将文件标记为deleted
暂存目录中,如果您使用
git status
完成此操作后,您将看到:
deleted: <file>
这是从暂存目录中删除文件的记录。如果您不想保留该记录而只是想撤消文件的前一阶段操作,请git reset HEAD <file>
改用。
-------- 答案结束 --------
PS:我注意到提到的一些答案:
git checkout -- <file>
该命令适用于文件已暂存,但暂存后工作目录中的文件已被修改的情况,使用该操作可从暂存目录恢复工作目录中的文件。换句话说,在此操作之后,更改发生在您的工作目录中,而不是您的暂存目录中。
如果你想按照某种模式删除文件并且你正在使用git rm --cached
,你也可以使用 file-glob 模式。
见这里。
在 version 之后2.23
,Git 引入了git restore
您可以用来执行此操作的命令。引用官方文档:
使用还原源中的一些内容还原工作树中的指定路径。如果路径被跟踪但在还原源中不存在,它将被删除以匹配源。
该命令还可用于恢复索引中的内容
--staged
,或恢复工作树和索引--staged --worktree
。
因此,您可以调用git restore --staged <path>
和取消暂存文件,但也可以保留所做的更改。请记住,如果文件未暂存,您将丢失对它所做的所有更改。
当你这样做时git status
,Git 会告诉你如何取消暂存:
Changes to be committed: (use "git reset HEAD <file>..." to unstage).
所以git reset HEAD <file>
对我有用,变化没有受到影响。
你要:
影响单个文件
从暂存区删除文件
不从索引中删除单个文件
不要撤消更改本身
解决方案是
git reset HEAD file_name.ext
或者
git reset HEAD path/to/file/file_name.ext
如果您对许多跟踪文件进行了更改,但只想暂存其中的几个文件,请执行
git add .
并不总是有利的(或推荐的)——因为它暂存了所有跟踪的文件(在某些情况下,您只想将更改保留给自己并且不想将它们暂存到远程存储库)。
也不是理想的做一堆
git add path/to/file1 path/to/file2
如果您有很多嵌套目录(大多数项目都是这种情况) - 会很烦人
那是 Git GUI 有用的时候(可能只是我使用它的时候)。只需打开 Git GUI,它就会显示暂存和未暂存的文件部分。从暂存部分中选择要取消暂存的文件,然后按
Ctrl+U
(用于窗户)
取消舞台。
您需要在文件的目录中,然后在终端中键入以下内容
git checkout -- <file>
我的样本:
$ 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)
您需要在文件的目录中,然后在终端中键入以下内容
git reset HEAD .
假设您只需要重置一个文件。
要一次取消暂存所有内容,请运行此命令
git reset HEAD -- .
git checkout -- <file>
它可以完美地从暂存区中删除文件