git rm --cached and 'deleted' status

10
我想知道为什么当我执行以下操作时:
git add <file>

然后,在那之后,我执行:

git rm --cached <file>

文件仍处于删除状态,位于阶段区域

这是一个例子: enter image description here

只想了解文件的“已删除”状态。

谢谢。


你必须执行 git commit 命令,才能使更改生效并提交到代码库。这样,如果你改变主意等情况,就可以取消暂存操作。基本上,它会列出你在工作副本中所做的更改(在这种情况下是 rm 命令),然后再将其提交到代码库。 - Chris
通常 绿色 表示对索引/暂存区进行的更改。因此,通过你的解释,我必须理解 已删除 的状态反映了在索引/暂存区上执行的 删除 操作。这有点奇怪,但也是有意义的。 - ferpega
2个回答

11

尝试使用 git reset HEAD yourFile,而不是 git rm --cached

混合重置将从索引中删除文件,而不会从工作树中删除文件。
请参见“撤消提交前的'git add'”。

在您的情况下,需要在 git reset 之前使用 git stash,然后使用 git stash pop 在重置后恢复正在进行的更改。


关于git rm --cached 后 'deleted' 状态的问题,该命令将文件的删除注册到索引中,因此您会看到它记录为下一次提交的 'deleted'。

OP Ferpega 坚持认为

我问为什么通过 git rm --cached 的结果是 'deleted',因为这个命令的行为应该与 git reset HEAD <file> 相同,就像你在 git rm 中看到的一样。

好吧,不是的,git rm 没有与 [git reset][8] 相同的行为。
两者都会影响索引,但:

  • 其中一个操作(git rm)会在下一次提交时记录文件被删除的操作,因此状态为'deleted'。
  • 另一个操作(git reset)会将HEAD复制到索引(index),将索引重置为HEAD中的文件内容。

Git reset会删除我在文件的工作目录中所做的更改。我不想失去我的文件修改。我只想取消暂存该文件。所以我现在正在做的就是正确的操作。我只需要一个关于“deleted”状态的解释。 - ferpega
我之前测试过在'git reset'之前使用git stash,然后再使用git stash pop,但它并不会将文件从暂存区中移除。在这三个命令执行完毕后,所有的东西都和执行git add命令之后一样。 - ferpega
@Ferpega 但是状态应该与 git add 前一样,显示修改内容 准备提交。 - VonC

2
您将文件添加到了索引/缓存中(在您的截图中为绿色),然后告诉git您想要删除该文件。索引/缓存更改只有在提交时才会执行。
我想您可能已经将文件放入了索引/缓存中,然后希望将其删除(以便不被提交)。
执行此操作的命令在git status给出的消息中(在圆圈中的deleted上方)。
git reset HEAD <filename>

嗨@David_Culp,是的,git reset HEAD <filename>确实可以做到你说的事情,我可以使用该命令来获得相同的结果。但我不是在要求执行某些操作。我想知道为什么git rm --cached会导致deleted状态存在,因为这个命令应该与git reset HEAD <file>具有相同的行为,正如您在此处所见:http://git-scm.com/docs/git-rm,但它添加了另一个中间结果,您必须`commit`才能获得最终结果。 - ferpega
1
@Ferpega git rm --cached 的行为与 git reset 不同,请参见我的编辑答案。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接