为什么有两种方法来卸载git中的文件?

有时候,git会建议git rm --cached来取消一个文件,有时git reset HEAD file 。 我应该什么时候使用哪个?

编辑:

D:codegt2>git init
Initialized empty Git repository in D:/code/gt2/.git/
D:codegt2>touch a

D:codegt2>git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       a
nothing added to commit but untracked files present (use "git add" to track)

D:codegt2>git add a

D:codegt2>git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#       new file:   a
#
D:codegt2>git commit -m a
[master (root-commit) c271e05] a
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a

D:codegt2>touch b

D:codegt2>git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       b
nothing added to commit but untracked files present (use "git add" to track)

D:codegt2>git add b

D:codegt2>git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   b
#

git rm --cached <filePath> 不会 取消文件的git rm --cached <filePath> ,它实际上会将文件从repo中删除 (假设它已经在之前已经提交),但会将文件留在工作树中(留下未跟踪的文件文件)。

git reset <filePath>取消给定文件的任何阶段性更改。

也就是说,如果你在一个新文件上使用了git rm --cached ,它基本上看起来就像你之前从未提交过的那样,因此它已经被暂时搁置了。


git rm --cached用于从索引中删除文件。 在文件已经在repo中的情况下, git rm --cached会将该文件从索引中删除,并将其保留在工作目录中,并且提交现在也将其从repo中删除。 基本上,在提交之后,您将会unversioned该文件并保留本地副本。

git reset HEAD file (默认情况下使用--mixed标志)与文件已经在repo中的情况不同,它将文件的索引版本替换为repo(HEAD)中的文件取消对其的修改

对于未版本控制的文件,由于该文件不在HEAD中,因此它将取消整个文件。 在这方面, git reset HEAD filegit rm --cached是相同的,但它们不一样(正如已经在repo中的文件所解释的那样)

Why are there 2 ways to unstage a file in git? - 在git中永远不会有任何一种方法可以做任何事情。 那是它的美丽:)


很简单:

  • git rm --cached <file> 使git完全停止跟踪文件 (将其保留在文件系统中,与纯粹的git rm *不同)
  • git reset HEAD <file> 取消自上次提交以来对 git reset HEAD <file> 所做的任何修改 (但不会在文件系统中恢复它们,与命令名称可能暗示的**相反)。 该文件保持在修订控制下。
  • 如果该文件之前没有在版本控制中(即,您正在初始化一个只是第一次git add的文件),那么这两个命令具有相同的效果,因此这些文件的出现是“两种方式做某事“。

    *请记住@DrewT在他的回答中提到的警告,关于git rm --cached了以前提交到存储库的文件。 在这个问题的背景下,一个刚刚添加并且尚未提交的文件,没有什么可担心的。

    **因为它的名字,我很害怕使用git reset命令很长时间 - 现在我仍然经常查看语法以确保不会搞砸。 ( 更新 :我终于花时间总结了tldr页面中git reset的使用情况,现在我有了一个更好的思路,说明它如何工作,以及当我忘记一些细节时的快速参考。)

    链接地址: http://www.djcxy.com/p/927.html

    上一篇: Why are there 2 ways to unstage a file in git?

    下一篇: HEAD in Git