git rm
将删除条目 集结区。这有点不同 来自git reset HEAD
“unstages” 文件。通过“非舞台”我的意思是它恢复 什么在那里的集结区 在我们开始修改之前 另一方面git rm
只是踢 完全脱离舞台的文件,所以 它不包括在下一个 从而有效地提交快照 删除它。默认情况下,
git rm file
会完全从暂存区域删除文件,也会从磁盘中删除> (工作目录)。要将文件保留在工作目录中,可以使用git rm --cached
。
但git rm --cached asd
和git reset head -- asd
之间究竟有什么区别?
答案 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提交中的状态,即撤消自上次提交后对其所做的任何更改。如果该更改恰好是新添加文件,那么它们将是等效的。