git rm和git rm --cached

时间:2019-02-07 14:49:21

标签: git

根据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

请注意,这里没有未跟踪的文件。为什么?

2 个答案:

答案 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进行模拟的情况。