How do I remove a single file from the staging area of Git but not remove it from the index or undo the changes to the file itself?
情景:我有一个Git存储库,其中的文件已经在索引中。我对几个文件进行了更改,打开git并使用"git add"将这些文件添加到我的临时区域。
问题:如何从临时区域中删除其中一个文件,而不是从索引中删除它,或者撤消对文件本身的更改?
如果我正确理解这个问题,您只需要"撤销"为该文件所做的
如果需要从临时区域中删除单个文件,请使用
如果需要从临时区域中删除整个目录(文件夹),请使用
您的修改将保留。当运行
详情请参见
1 | git rm --cached FILE |
,
1 | git rm -r --cached CVS */CVS |
无论您以前是否有任何承诺,都可以工作。
所以,对TimHenigan的答案稍作调整:您需要在文件名之前使用。如下所示:
1 | git reset HEAD -- <file> |
1 | git reset filename.txt |
如果在filename.txt中进行了修改,则错误地将其添加到stage,并且希望从staging中删除该文件,但不希望丢失更改。
如果只想删除对文件所做更改的子集,可以使用:
1 | git reset -p |
或
1 | git reset -p <file_name> |
这个命令基本上与
如果您想删除某个特定模式下的文件,而您使用的是
请看这里。
当你做
1 | Changes to be committed: (use"git reset HEAD <file>..." to unstage). |
所以,江户十一〔十〕为我工作,变化是不可触及的。
你想要:
影响到单个文件
从临时区域删除文件
不从索引中删除单个文件
不要撤消更改本身
解决办法是
1 | git reset HEAD file_name.ext |
或
1 | git reset HEAD path/to/file/file_name.ext |
如果您对许多跟踪文件进行了更改,但只想对其中的一些进行阶段性更改,请执行
并不总是有利的(或推荐的)-因为它会将所有跟踪的文件(有些情况下,您只想保留对自己的更改,而不想将它们转移到远程存储库)。
做一堆也不理想
如果你有很多嵌套的目录(大多数项目都是这样),那会很烦人。
这就是GitGUI有用的时候(可能只有在我使用它的时候)。只需打开git-gui,它就会显示分段和未分段的文件部分。从"分段"部分中选择要取消分段的文件,然后按
Ctrl+U (for windows)
把它们拆下来。
我认为你可能对索引的概念感到困惑,正如@cb bailey所评论的:
The staging area is the index.
您可以简单地将临时目录和索引视为相同的事情。所以,就像@tim henigan的答案一样,我猜:
you simply want to"undo" the
git add that was done for that file.
这是我的答案:
通常,有两种方法可以撤消阶段操作,正如前面提到的其他答案:
1 | git reset HEAD <file> |
和
1 | git rm --cached <file> |
但是有什么区别呢?
假定该文件已被暂存,并且也存在于工作目录中,如果要将其从暂存目录中删除,请使用
1 | git status |
完成此操作后,您将看到:
1 | deleted: <file> |
这是从临时目录中删除文件的记录。如果您不想保留该记录,只想撤消文件的前一阶段操作,请使用
--------回答结束-------
附:我注意到一些答案提到:
此命令用于文件已暂存,但文件在暂存后已在工作目录中修改的情况,请使用此操作从暂存目录还原工作目录中的文件。换句话说,在这个操作之后,更改发生在工作目录中,而不是临时目录中。
您需要在文件的目录中,然后在终端中键入以下内容
1 | git reset HEAD . |
假设您只需要重置一个文件。
若要立即取消对所有内容的保存,请运行此命令
1 | git reset HEAD -- . |
从临时区域删除文件非常有效
就我而言,我知道
1 | git checkout -- FILE |