为什么有两种方法来卸载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 file
和git 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
的使用情况,现在我有了一个更好的思路,说明它如何工作,以及当我忘记一些细节时的快速参考。)
上一篇: Why are there 2 ways to unstage a file in git?
下一篇: HEAD in Git