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

GitRef.org – 基本 :

git rm会从暂存区删除条目。 这与git reset HEAD有些不同,它会“暂停”文件。 我的意思是说,在我们开始修改事物之前,将其暂存区恢复到那里。 另一方面, git rm只是将文件踢出整个舞台,以便它不包含在下一个提交快照中,从而有效地删除它。

默认情况下,一个git rm file将完全移除临时区域中的文件,也会从您的磁盘>(工作目录)中删除该文件。 要将文件保留在工作目录中,可以使用git rm --cached

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

有三个地方,一个文件可以是 – 树,索引和工作副本。 当你只是添加一个文件到一个文件夹,你将其添加到工作副本。

当你做的东西像git add file你把它添加到索引。 而当你提交它时,你也将它添加到树中。

它可能会帮助你在git reset中知道三个更常见的标志:

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

这种forms将当前分支头重置为<commit>并可能更新索引(将其重置为<commit>的树),并根据<mode>工作树,该树必须是以下之一:
– 柔软的

根本不碰触索引文件或工作树(但像所有模式一样,将头重置为<commit> )。 这将保留所有更改的文件“更改为提交”,因为git状态会将其放入。

–mixed

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

– 硬

重置索引和工作树。 丢弃自从<commit>之后对工作树中跟踪文件所做的任何更改。

现在,当你做一些像git reset HEAD – 你实际上做的是git reset HEAD --mixed ,它会“重置”索引到它开始添加文件/添加修改索引之前的状态(通过git add在这种情况下,工作副本和索引(或分段)是同步的,但是在复位之后,使HEAD和索引同步。

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

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

 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" 

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

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