“git rm --cached x”vs“git reset head - x”?

GitRef.org - 基础:

git rm --cached asd将从中删除条目   集结区。 这有点不同   来自git reset head -- asd其中“unstages”  文件。 通过“非舞台”我的意思是它恢复   什么在那里的集结区   在我们开始修改之前   另一方面,git rm只是踢   完全脱离舞台的文件,所以   它不包括在下一个   从而有效地提交快照   删除它。

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

但是git rm --cached asdgit reset head -- asd之间究竟有什么区别?

3个解决方案
176 votes

例如,文件有三个位置 - 树,索引和工作副本。 当您只是将文件添加到文件夹时,您将其添加到工作副本。

当您执行类似git rm的操作时,将其添加到索引中。 当你提交它时,你也将它添加到树中。

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

git reset [--git rm] [git rm --cached]

此表单可能会将当前分支头重置为git rm   更新索引(将其重置为git rm --cached的树)和   工作树取决于git add file,这必须是其中之一   以下:
- 柔软的

根本不触摸索引文件和工作树(但重置   头到git rm,就像所有模式一样)。 这留下了你所有的   已更改文件“要提交的更改”,因为git status会将其设置为。

--mixed

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

- 硬

重置索引和工作树。 对跟踪文件的任何更改   自git rm以来的工作树被丢弃。

现在,当你做git rm这样的事情时 - 你实际做的是git rm --cached并且它会将索引“重置”到你开始添加文件/添加修改到索引之前的状态(通过git add file)在这种情况下,工作 复制和索引(或暂存)是同步的,但您在重置后使HEAD和索引同步。

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

manojlds answered 2019-06-08T02:35:58Z
66 votes

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

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"

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

Greg Hewgill answered 2019-06-08T02:36:33Z
31 votes

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

yuriks answered 2019-06-08T02:37:01Z
translate from https://stackoverflow.com:/questions/5798930/git-rm-cached-x-vs-git-reset-head-x