情况:我有一个Git存储库,其中包含已存在于索引中的文件。我对几个文件进行了更改,打开Git并使用“git add”将这些文件添加到我的临时区域。
问题:如何从暂存区域中删除其中一个文件但不将其从索引中删除或撤消对文件本身的更改?
如果我正确理解了这个问题,你只需要“撤消”为该文件完成的git add
。
如果需要从暂存区域中删除单个文件,请使用
git reset HEAD -- <file>
如果需要从暂存区域中删除整个目录(文件夹),请使用
git reset HEAD -- <directoryName>
您的修改将被保留。当您运行git status
时,该文件将再次显示为已修改但尚未暂存。
有关详细信息,请参阅git reset
man page。
如果您对许多跟踪文件进行了更改,但只希望对其中的一些文件进行更改,请执行此操作
git add .
并不总是有利(或推荐) - 因为它会对所有跟踪的文件进行分级(某些情况下,您只想对自己进行更改,而不希望将它们转发到远程存储库)。
做一堆也不理想
git add path/to/file1 path/to/file2
如果你有很多嵌套目录(在大多数项目中就是这种情况) - 会变得很烦人
这就是Git GUI有用的时候(可能只有我使用它的时候)。只需打开Git GUI,它就会显示暂存和未暂存的文件部分。从舞台部分中选择要取消暂停的文件,然后按
Ctrl+U
(用于Windows)
展开他们。
我认为你可能对索引的概念感到困惑,如@CB Bailey commented:
暂存区域是索引。
您可以简单地将暂存目录和索引视为同一件事。 所以,就像@Tim Henigan's answer一样,我想:
你只想“撤消”为该文件完成的
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 reset HEAD .
假设您只需要重置一个文件。
要一次取消所有内容,请运行此命令
git reset HEAD -- .
git checkout -- <file>
它完美地从暂存区域中删除文件
就我而言,我做到了
git checkout -- FILE
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
相反:它只会从暂存区域中删除所选的更改。我发现在“取消添加”我错误添加的内容时非常有用。
如果要删除某个模式后面的文件并使用git rm --cached
,则也可以使用file-glob模式。
见here。
你要:
而解决方案是
git reset HEAD file_name.ext
要么
git reset HEAD path/to/file/file_name.ext
当你做git status
时,Git会告诉你如何取消它:
Changes to be committed: (use "git reset HEAD <file>..." to unstage).
所以git reset HEAD <file>
为我工作,变化没有被触及。