根据git rm doc,
从索引或工作树和索引中删除文件。 git rm不会仅从您的工作目录中删除文件。
还
-缓存:使用此选项可以取消登台并仅从索引中删除路径。工作树文件,无论是否修改,都将保留
现在,我发现他们更改工作树和索引的方式有所不同,我认为它与上面的定义不匹配。
首先我运行了git rm --cached
,然后看到了:
$ git rm --cached src/main/java/com/kang/pagination/PaginationResult.java
rm 'src/main/java/com/kang/pagination/PaginationResult.java'
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: src/main/java/com/kang/pagination/PaginationResult.java
Untracked files:
(use "git add <file>..." to include in what will be committed)
src/main/java/com/kang/pagination/PaginationResult.java
我们可以将更改视为未跟踪的文件并显示在暂存区域中。
当文件更改在暂存区域中时,为什么我们在未跟踪区域中存在文件?
相反,如果我已经运行过git rm
,那我就会得到:
$ git rm src/main/java/com/kang/pagination/PaginationResult.java
rm 'src/main/java/com/kang/pagination/PaginationResult.java'
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: src/main/java/com/kang/pagination/PaginationResult.java
请注意,这里没有未跟踪的文件。为什么?
答案 0 :(得分:3)
尽管进行了编辑,但命令的功能(而不是命令的内部工作)完全可以解释问题的答案。
也许困惑源于对如何解释git status
的理解。 “未跟踪的文件”是工作树中不在索引中的文件。(要在默认的status
输出中列出,也不能忽略它。)
因此,如果您从干净的工作树开始,那意味着工作树中的任何文件也都在索引中-因此不要被跟踪。
但是,如果您git rm --cached
将文件保留在工作树中,则会将其从索引中删除。这意味着wokrtree中现在有一个文件不在索引中,因此,除非忽略该路径,否则它将显示为未跟踪的文件-即使工作树本身没有任何更改。
这与git rm
(没有--cached
参数)在内部工作方面不同,而在命令的作用方面不同。此命令还将从工作树中删除文件;在这种情况下,最后,工作树中没有文件,但索引中没有文件(未跟踪的文件)。
答案 1 :(得分:1)
当文件更改在暂存区中时,为什么我们在未跟踪的区域中有文件?
因为您使用过git rm --cached
,该文件从暂存区中删除了文件,但是将文件保留在磁盘上。由于存储库中现在没有文件,因此必须取消跟踪磁盘 上的文件。
请注意,这里没有未跟踪的文件。为什么?
因为该文件在磁盘上不存在。因此它不可能被追踪,因为它不存在。
想象一下,在运行git rm
之后(在提交该changeE之前),您重新创建一个具有相同名称的新文件。运行git status
会告诉您该文件未跟踪,就像您创建了不在索引中的任何新文件一样。这是您刚刚通过运行git rm --cached
进行模拟的情况。