为什么"git rm --cached"会移除最新的文件?

7 浏览
0 Comments

为什么"git rm --cached"会移除最新的文件?

我在本地git仓库中有一个README.md文件。本地git仓库中没有任何暂存的内容,工作树也没有任何改动。如下所示:

$ git status
在分支master上
您的分支与'origin/master'保持一致。
无可提交的内容,工作树干净

然后我运行git rm --cached -- README.md,它显示如下:

$ git rm --cached -- README.md
删除 'README.md'

根据git help rm

--cached

使用此选项仅从索引中取消暂存并删除路径。工作树文件(无论是否修改)将保持不变。

关于README.md没有暂存的更改。因此,暂存区/索引应该不包含任何内容。为什么它还是被删除了?

附加说明1

根据@DietrichEpp的回答:

就git而言,状态存在于三个地方:

  1. 工作树
  2. 索引
  3. 仓库

Git通过比较1和2来决定什么是未跟踪的未暂存的

Git通过比较2和3来决定什么是待提交的

可以使用git reset来改变1和/或2的状态。

0
0 Comments

为什么"git rm --cached"会删除已更新的文件?

git rm --cached命令用于从git的索引中删除文件,但不会从实际文件系统中删除文件。这个命令通常用于停止追踪某个文件,但仍然保留在本地。然而,如果使用git rm --cached命令来删除一个已经更新的文件,可能会导致问题。

索引(index)是一个暂存区域,它包含了将要提交的文件的快照。当我们使用git add命令将文件添加到索引时,这些文件就会成为暂存区域的一部分。当我们运行git commit命令时,git会将索引中的内容提交到仓库中。

假设我们依次运行以下命令:

touch a.txt b.txt

git add a.txt b.txt

git commit

git rm --cached a.txt

git commit

第一次运行git add命令时,a.txt和b.txt被添加到了索引中。然后,git commit命令将索引中的内容提交到了仓库中。

此时,索引中仍然包含a.txt和b.txt。

当我们运行git rm --cached命令时,它将a.txt从索引中删除,但b.txt仍然在索引中。然后,git commit命令将索引中的内容(只有b.txt)提交到仓库中。由于第一个提交包含了a.txt,而第二个提交没有,所以会显示为删除了a.txt。

需要注意的是,git rm --cached命令并不会删除实际的文件,也不会影响git commit命令。所以a.txt文件仍然存在于文件系统中。

git status命令主要用于显示索引和实际文件系统之间的差异。如果git status命令输出为空,那么表示索引中的文件和文件系统中的文件是一致的。

当我们使用git rm --cached命令删除已经更新的文件时,会导致这些文件在下一次提交时被标记为删除。为了解决这个问题,我们可以使用git reset命令将文件从索引中恢复,然后重新添加到索引中,再进行提交。

总之,git rm --cached命令的作用是从索引中删除文件,但不会删除实际的文件。当我们误用该命令删除已经更新的文件时,会导致这些文件在下一次提交时被标记为删除。要解决这个问题,可以使用git reset命令来恢复文件并重新添加到索引中。

0