PHL*_*LAK 1177 git version-control staging
情况:我有一个Git存储库,其中包含已存在于索引中的文件.我对几个文件进行了更改,打开Git并使用"git add"将这些文件添加到我的临时区域.
问题:如何从暂存区域中删除其中一个文件但不将其从索引中删除或撤消对文件本身的更改?
Tim*_*gan 1821
如果我正确理解了这个问题,你只需要"撤消" git add
对该文件所做的操作.
如果需要从暂存区域中删除单个文件,请使用
git reset HEAD -- <file>
如果需要从暂存区域中删除整个目录(文件夹),请使用
git reset HEAD -- <directoryName>
您的修改将被保留.当您运行git status
该文件时,将再次显示为已修改但尚未暂存.
有关详细信息,请参见git reset
手册页.
小智 146
git rm --cached FILE
Run Code Online (Sandbox Code Playgroud)
,
git rm -r --cached CVS */CVS
Run Code Online (Sandbox Code Playgroud)
Gue*_*erd 53
所以,稍微调整一下Tim Henigan的答案:你需要在文件名之前使用 - .它看起来像这样:
git reset HEAD -- <file>
Run Code Online (Sandbox Code Playgroud)
小智 16
git reset filename.txt
Run Code Online (Sandbox Code Playgroud)
如果您在filename.txt中进行了修改,则会将其添加到错误的阶段,并且您希望从暂存中删除该文件,但您不希望丢失更改.
Rui*_*uik 12
对于较新版本的 Git,有git restore --staged <file>
.
当我git status
使用 Git 版本时2.26.2.windows.1
,还建议取消暂存:
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
Run Code Online (Sandbox Code Playgroud)
(这篇文章表明,git reset HEAD
此时建议在早期版本中使用)
我强烈推荐这个文章,解释之间的差异git revert
,git restore
以及git reset
对还附加参数git restore
。
我认为您可能对index的概念感到困惑,正如@CB Bailey 评论的那样:
暂存区就是索引。
您可以简单地将暂存目录和索引视为同一事物。所以,就像@Tim Henigan 的回答
一样,我想:
您只想“撤消”
git add
对该文件所做的操作。
这是我的回答:
通常,有两种方法可以撤消阶段操作,正如其他答案已经提到的那样:
git reset HEAD <file>
Run Code Online (Sandbox Code Playgroud)
和
git rm --cached <file>
Run Code Online (Sandbox Code Playgroud)
但有什么区别呢?
假设文件已暂存并且也存在于工作目录中,git rm --cached <file>
如果要将其从暂存目录中删除,并将文件保留在工作目录中,请使用。但请注意,如果您使用,此操作不仅会从暂存目录中删除文件,还会将该文件标记为deleted
在暂存目录中
git status
Run Code Online (Sandbox Code Playgroud)
执行此操作后,您将看到以下内容:
deleted: <file>
Run Code Online (Sandbox Code Playgroud)
这是从暂存目录中删除文件的记录。如果您不想保留该记录而只是想撤消文件的前一阶段操作,请改用git reset HEAD <file>
。
-------- 答案结束 --------
PS:我注意到提到了一些答案:
git checkout -- <file>
该命令适用于文件已经暂存,但文件暂存后在工作目录中被修改的情况,使用此操作可以从暂存目录恢复工作目录中的文件。换句话说,在此操作之后,更改发生在您的工作目录中,而不是您的暂存目录中。
在版本之后2.23
,Git 引入了git restore
可以用来执行此操作的命令。引用官方文档:
使用恢复源中的某些内容恢复工作树中的指定路径。如果跟踪了路径但恢复源中不存在该路径,则会将其删除以匹配源。
该命令还可以用于使用 恢复索引中的内容
--staged
,或者使用 恢复工作树和索引--staged --worktree
。
因此,您可以调用git restore --staged <path>
并取消暂存文件,但也可以保留所做的更改。请记住,如果文件未暂存,您将丢失对其所做的所有更改。
如果您只想删除文件更改的子集,可以使用:
git reset -p
Run Code Online (Sandbox Code Playgroud)
要么
git reset -p <file_name>
Run Code Online (Sandbox Code Playgroud)
此命令基本上是相反的git add -p
:它只会从暂存区域中删除所选的更改.我发现在"取消添加"我错误添加的内容时非常有用.
归档时间: |
|
查看次数: |
591889 次 |
最近记录: |