【问题标题】:Why "git rm --cached" remove the up-to-date files?为什么“git rm --cached”删除最新文件?
【发布时间】:2017-12-16 07:10:39
【问题描述】:

我的本​​地 git 存储库中有一个 README.md。本地 git repo 没有上演任何内容,工作树中也没有任何变化。见下文:

$ 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 的阶段性更改。所以暂存区/索引不应该包含任何内容。为什么它仍然被删除?

添加1

基于@DietrichEpp 的回答:

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

  1. 工作树
  2. 索引
  3. 回购

Git 通过比较 1 和 2 来决定 un-trackedun-staged 是什么;

Git 通过比较 2 和 3 来决定 to-be-commited 是什么;

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

【问题讨论】:

  • 更准确地说,有HEAD 提交(它应该代替你的项目#3),然后是索引(你的#2),然后是工作树(你的#1)。如果您使用git status --short,则它们是从左到右、成对比较的。索引(并且索引)定义了跟踪的内容。

标签: git


【解决方案1】:

索引不包含任何内容,它包含您要提交的任何内容,包括已经属于 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 为空,那么磁盘上所有未被忽略的文件也都在索引中。

【讨论】:

  • 我尝试了更多。似乎index 拥有所有跟踪的文件。当我从索引中 rm 一个文件时,它就变成了未跟踪的。未从文件系统中物理删除。在我提交之后,它(README.md)就变成了未跟踪的文件之一。
  • 这很有趣。如果我使用resetindex 中的某些文件状态设置为其他版本,git status 会告诉我有一些changes to be commited。实际上,我对工作树没有任何改变。一旦我使用git add 添加特定文件而不运行git commitgit status 说我没有什么可提交的。所以看起来git status 只是盲目地比较索引、repo 和工作树中的内容。它不关心历史。
  • 没错,git status 不关心历史。
猜你喜欢
  • 2014-05-02
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 2019-09-03
  • 2023-03-16
  • 1970-01-01
  • 2021-04-02
  • 2017-06-06
相关资源
最近更新 更多