为什么" git rm --cached"删除最新文件?

时间:2017-07-12 03:19:27

标签: git

我在我当地的git repo中有一个README.md。本地git仓库没有任何阶段,工作树中没有任何变化。见下文:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean

然后我运行git rm --cached -- README.md,它说:

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

根据git help rm

  

- 缓存

     

使用此选项可以停止并删除仅<索引的路径。无论是否修改了工作树文件,都将保持不变。

没有关于README.md的分阶段更改。因此,暂存区/索引应该不包含任何内容。为什么它仍然被移除?

ADD1

根据@ DietrichEpp的回答:

就git而言,国家存在于3个地方:

  1. 工作树
  2. 索引
  3. 回购
  4. Git通过比较1和2决定了un-trackedun-staged的内容;

    Git通过比较2和3确定了to-be-commited的内容;

    git reset可用于更改1和/或2中的状态。

1 个答案:

答案 0 :(得分:3)

索引不包含任何内容,它包含您要提交的内容,包括已经属于repo的文件。我们假设您运行以下命令:

touch a.txt b.txt
git add a.txt b.txt
git commit
git rm --cached a.txt
git commit

首次运行git add时,它会将a.txtb.txt添加到索引中。然后,git commit获取索引中的任何内容并提交它。

索引仍然包含a.txtb.txt

当您git rm --cached时,它会从索引中删除a.txt,但b.txt仍在索引中。然后,git commit获取索引中的任何内容(仅b.txt)并提交它。 a.txt文件仍然存在,因为git rm --cached没有触及实际文件,git commit也没有。

因为第一次提交包含a.txt而第二次提交没有,所以这显示为删除。

git status的主要功能是向您显示索引与磁盘上实际文件之间的差异。因此,如果git status为空,那么磁盘上所有未被忽略的文件也都在索引中。