“ git rm ——缓存的 x”和“ git 复位头—— x”?

GitRef.org-Basic :

git rm将从 集结地,这里有点不一样 从 git reset HEAD的“取消阶段” 文件,我说的“卸载”是指还原 集结地的位置 在我们开始修改之前。 另一方面 git rm只是踢 把文件完全从舞台上撤下来,所以 它不包括在下一个 提交快照,从而有效地 删除。

默认情况下,git rm file会将文件从暂存区域完全删除,也会从磁盘 > (工作目录)中删除。若要将档案保留在工作目录内,可使用 ABc1。

但是 git rm --cached asdgit reset head -- asd到底有什么不同呢?

210700 次浏览

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

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

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

VS

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

注意,如果没有更改任何 别的内容,那么第二次提交实际上不会执行任何操作。

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

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

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

Git 复位[—— <mode>][ <commit>]

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

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

混合

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

很难

重置索引和工作树 丢弃 <commit>后的工作树。

现在,当您执行类似于 git reset HEAD的操作时,实际上您正在执行的是 git reset HEAD --mixed,它将“重置”索引到您开始向索引添加文件/添加修改之前的状态(通过 git add)。在这种情况下,无论工作副本的状态如何,您都不会对其进行任何更改,但是您以这样的方式更改了索引,现在该索引与树的 HEAD 同步。无论是使用 git add处理以前提交但已更改的文件,还是添加新的(以前未跟踪的)文件,ABC0都与 git add完全相反。

另一方面,abc0会从工作目录和索引中删除一个文件,当你提交时,这个文件也会从树中删除。但是,git rm --cached只从索引中删除该文件,并将其保存在工作副本中。在这种情况下,如果文件以前提交过,然后从树的 HEAD 和工作副本中将索引设置为 与众不同,这样 HEAD 现在有了以前提交的文件版本,索引完全有了 没有文件,工作副本有了对它的最后修改。现在提交将同步索引和树,并且文件将从树中删除(在工作副本中不跟踪它)。当使用 ABC2添加一个新的(以前未跟踪的)文件时,那么 ABC1与 ABC2完全相反(并且与 git reset HEAD几乎完全相同)。

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