「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 --cached的git diff命令不会显示任何差异,但git diff --cached节目的差异,就好像它仍缓存。该git status然而,文件显示为是Untracked。似乎有点前后矛盾。
— haridsv 2011年

7
没关系...我应该已经习惯了git reset --mixed。git 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:--用于将命令选项与文件名分开。如果同时有一个分支和一个名为的文件asd,git 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 file。git add file在添加新的以前未跟踪的文件的特定情况下,此行为恰好与相反。在任何其他情况下的相反git add file是git 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.