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

时间:2011-04-27 03:13:03

标签: git git-reset git-index git-rm

GitRef.org - Basic

  

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

     

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

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

3 个答案:

答案 0 :(得分:188)

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

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

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

  

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

     

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

     

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

     

- 混合

     

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

     

- 很难

     

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

现在,当您执行类似git reset HEAD的操作时 - 您实际执行的操作是git reset HEAD --mixed,它会将索引“重置”为您开始添加文件/添加修改之前的状态index(通过git add在这种情况下,工作副本和索引(或暂存)处于同步状态,但您在重置后使HEAD和索引保持同步。

另一方面,

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

答案 1 :(得分:68)

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

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"

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

答案 2 :(得分:35)

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