"git rm --cached x"vs"git reset head - x"?

Pac*_*ier 149 git git-reset git-index git-rm

GitRef.org - 基础:

git rm将从暂存区域中删除条目.这与git reset HEAD"unstages"文件有点不同.通过"unstage"我的意思是它将暂存区域恢复到我们开始修改之前的状态. git rm另一方面,只需将文件完全从舞台上踢出,这样它就不会包含在下一个提交快照中,从而有效地删除它.

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

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

man*_*lds 210

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

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

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

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

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

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

--mixed

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

- 硬

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

现在,当你做类似的事情git reset HEAD- 你实际做的是什么git reset HEAD --mixed,它会将索引"重置"到你开始添加文件/添加修改到索引之前的状态(通过git add)在这种情况下,工作副本和index(或staging)处于同步状态,但您在重置后使HEAD和索引同步.

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

  • 我发现使用工作副本,树和工作树有点令人困惑.工作树是工作副本还是树? (12认同)
  • 没关系......我应该使用`git reset --mixed`.我对'git rm --cached`与`git add`相反的说法感到有点困惑.从字面上看,这是不正确的,可能会造成损害.在我的例子中,我使用`git add`将修改后的文件添加到临时区域,并希望与"添加"相反,而不是文件的初始添加.+ Greg Hewgill的回答帮助我获得了更清晰的画面. (7认同)
  • 正如@haridsv所提到的,说`git rm --cached`'与`git add file`'正好相反是一种误导。git reset file与git add file相反。 (2认同)

Gre*_*ill 77

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

git rm --cached asd
git commit -m "the file asd is gone from the repository"
Run Code Online (Sandbox Code Playgroud)

git reset HEAD -- asd
git commit -m "the file asd remains in the repository"
Run Code Online (Sandbox Code Playgroud)

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

  • @yuva:` - `用于从文件名中分离命令选项.如果有一个*branch*和一个*文件*命名为`asd`,那么`git reset HEAD asd`将是不明确的.` - `表示"此后的所有内容都是文件名". (29认同)
  • 你能告诉我这个双连字符是什么 - 在HEAD实际意味着什么之后? (3认同)
  • @alcoholisevil 不,除非在特殊情况下。请参阅 [this](/sf/answers/405927441/) 优秀、简洁的答案。 (2认同)

yur*_*iks 38

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

  • 结合概念(如其他答案中所述),`git rm --cached file`与`git add`相反,这个答案对我来说很有意义,并且非常简洁.几乎和这个评论一样短;) (7认同)
  • @yuriks - +1给出了很好的答案,特别是在最后一句话. (3认同)
  • @rbatt只是为了在此处添加注释,并澄清一下,git rm --cached file与git add file **相反。在您添加了新的,以前未跟踪的文件的特定情况下,此行为恰好与“ git add file”相反。在其他所有情况下,与“ git add file”相反的是“ git reset HEAD file”。**`git reset HEAD file`也会在第一种情况下反转git add file`(添加未跟踪的文件),并且在每种情况下,这就是为什么git建议您反转git add的原因。* * (2认同)