174

GitRef.org - 基本

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

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

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

4

3 回答 3

235

比如说,一个文件可以存在三个地方——(提交的)树、索引和工作副本。当您只是将文件添加到文件夹时,您就是将其添加到工作副本中。

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

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

git 重置 [-- <mode>] [ <commit>]

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

完全不触及索引文件或工作树(但将头部重置为<commit>,就像所有模式一样)。正如 git status 所说,这会使您所有更改的文件都“提交更改”。

--混合

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

- 难的

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

现在,当您执行类似的操作时git reset HEAD,您实际上正在做的是git reset HEAD --mixed,它将索引“重置”到您开始添加文件/添加对索引的修改之前的状态(通过git add)。在这种情况下,无论工作副本的状态是什么,您都没有对其进行任何更改,但是您以一种现在与树的 HEAD 同步的方式更改了索引。是否git add用于暂存以前提交但已更改的文件,或添加新的(以前未跟踪git reset HEAD的)文件,与git add.

git rm另一方面,从工作目录和索引中删除一个文件,当您提交时,该文件也会从树中删除。git rm --cached但是,仅从索引中删除文件并将其保存在您的工作副本中。在这种情况下,如果文件先前已提交,那么您将索引与树的 HEAD 和工作副本不同,这样 HEAD 现在具有文件的先前提交版本,索引在全部,并且工作副本具有它的最后修改。现在提交将同步索引和树,并且文件将从树中删除(使其在工作副本中未跟踪)。何时git add用于添加新的(以前未跟踪的)文件,然后git rm --cachedgit add与(并且几乎相同)完全相反git reset HEAD

Git 2.25 为这些情况引入了一个新命令git restore,但从 Git 2.28 开始,它在手册页中被描述为“实验性”,因为行为可能会改变。

于 2011-04-27T06:14:58.110 回答
94

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

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"

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

于 2011-04-27T03:19:44.653 回答
52

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

于 2011-04-27T03:18:48.303 回答