「git rm --cached x」与「git reset head --x」?


163

GitRef.org-基本

git rm将从登台区域删除条目。这与git reset HEAD“取消登台”文件有些不同。所谓“非舞台”,是指它将舞台区域恢复到我们开始修改之前的位置。 git rm另一方面,只是将文件完全踢出舞台,因此它不包含在下一个提交快照中,从而有效地将其删除。

默认情况下,a git rm file将从暂存区中完全删除该文件,并且还将其从磁盘>(工作目录)中删除。要将文件保留在工作目录中,可以使用git rm --cached

但是git rm --cached asd和之间到底有什么区别git reset head -- asd

Answers:


219

例如,可以在三个位置放置文件-树,索引和工作副本。当您仅将文件添加到文件夹时,即会将其添加到工作副本中。

当您执行类似操作时git add file,请将其添加到索引中。提交时,也将其添加到树中。

它可能会帮助您了解git reset中另外三个常见标志:

git reset [- <mode>] [ <commit>]

此表单将当前分支头重置为,<commit>并可能更新索引(将其重置为的树<commit>)和取决于的工作树<mode>,该树必须为以下之一:--
soft

完全不触摸索引文件或工作树(但将头重置为<commit>,就像所有模式一样)。就像git status那样,这会将所有更改的文件保留为“要提交的更改”。

-混合

重置索引但不重置工作树(即,已更改的文件将保留但未标记为提交),并报告尚未更新的内容。这是默认操作。

- 硬

重置索引和工作树。由于对工作树中跟踪文件的任何更改,<commit>都将被丢弃。

现在,当您执行类似操作时git reset HEAD,实际上是git reset HEAD --mixed将索引重新设置为开始添加文件/对索引添加修改之前的状态(通过git add),在这种情况下,工作副本和索引(或暂存)是同步的,但是重置后您使HEAD和索引保持同步。

git rm另一方面,从工作目录和索引中删除文件,并且在提交时,该文件也会从树中删除。git rm --cached但是,仅从索引中删除文件,并将其保留在工作副本中。这与的完全相反。git add file 在这种情况下,您使索引不同于HEAD和工作文件,因为HEAD具有文件的先前提交版本,工作副本(如果有)或HEAD的内容进行了最后修改。文件,然后您从索引中删除了该文件。现在,提交将同步索引和树,并且文件将被删除。


我注意到,之后git rm --cachedgit diff命令不会显示任何差异,但git diff --cached节目的差异,就好像它仍缓存。该git status然而,文件显示为是Untracked。似乎有点前后矛盾。
haridsv 2011年

7
没关系...我应该已经习惯了git reset --mixedgit rm --cached与的相反的说法使我有些困惑git add。从字面上看,这是不正确的,并且可能导致损坏。就我而言,我曾经git add将修改过的文件添加到登台区域,并希望与“ that add”相反,而不是文件的初始添加。+ Greg Hewgill的回答帮助我更加清楚了。
haridsv 2011年

12
我发现工作副本,树和工作树的使用有些混乱。工作树是工作副本还是树?
Nealv 2013年

3
正如@haridsv所提到的,说git rm --cached'与git add file'的正相反是令人误解的。git reset file更接近于git add file
马特·布朗

@Nealv迟到了,但对于其他发现此线程的人:工作副本,树和工作树都引用同一件事(在git的上下文中)。
De Novo

83

也许一个例子会有所帮助:

git rm --cached asd
git commit -m "the file asd is gone from the repository"

git reset HEAD -- asd
git commit -m "the file asd remains in the repository"

请注意,如果您没有进行任何其他更改,则第二次提交实际上将不会执行任何操作。


3
您能告诉我在HEAD实际含义之后,该双连字符是什么意思吗?
尤瓦2014年

30
@yuva:--用于将命令选项与文件名分开。如果同时有一个分支和一个名为的文件asdgit reset HEAD asd则将是不明确的。该--说“一切都跟随这是一个文件名”。
Greg Hewgill 2014年

git reset HEAD <file>完全一样的git rm --cached <file>,然后git add --intent-to-add <file>
酒精是邪恶的

1
@alcoholisevil不,除了特殊情况。看到这个出色的,简洁的答案。
De Novo

45

git rm --cached file将从舞台上删除文件。也就是说,当您提交文件时,该文件将被删除。git reset HEAD -- file只需将登台区域中的文件重置为HEAD提交时的状态,即撤消自上次提交以来对文件所做的任何更改。如果该更改恰好是新添加的文件,则它们将是等效的。


7
结合与git rm --cached file恰恰相反的概念(如其他答案中所述)git add,这个答案对我来说很有意义,而且非常简洁。几乎与此评论一样短;)
rbatt 2015年

2
@rbatt只是为了将注释也放在这里并弄清楚,git rm --cached file与并非相反git add filegit add file在添加新的以前未跟踪的文件的特定情况下,此行为恰好与相反。在任何其他情况下的相反git add filegit reset HEAD file在第一种情况下(添加未跟踪的文件)git reset HEAD file也会反转git add file,这在每种情况下都是如此,这就是为什么git建议您反转git add的原因。
De Novo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.