git rm 和 git rm --cached 的区别

945号

根据git rm doc

从索引或从工作树和索引中删除文件。git rm 不会仅从您的工作目录中删除文件。

还,

--cached:使用此选项仅从索引中取消和删除路径。工作树文件,无论是否修改,都将被保留。

现在,我发现他们改变工作树和索引的方式有所不同,我觉得它与上面的定义不符。

首先我跑了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

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

马克·阿德尔斯伯格

尽管您进行了编辑,但您的问题的答案完全由命令的作用(而不是命令的内部工作)来解释。

也许混乱源于理解如何解释git status“未跟踪文件”是工作树中不在索引中的文件。(要在默认status输出中列出,也不能忽略它。)

因此,如果您从一个干净的工作树开始,这意味着工作树中的任何文件也在索引中 - 因此不会被跟踪。

但是,如果您使用git rm --cached该文件,它会从索引中删除,而被单独留在工作树中。这意味着 wokrtree 中现在有一个不在索引中的文件,因此除非忽略该路径,否则它将显示为未跟踪的文件 - 即使工作树本身没有任何更改。

这不同于git rm(没有--cached参数)不是在内部工作方面,而是在命令的作用方面。此命令还会从工作树中删除文件在这种情况下,最后工作树中没有文件,但索引中没有文件(未跟踪的文件)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章