比如说,一个文件可以存在三个地方——(提交的)树、索引和工作副本。当您只是将文件添加到文件夹时,您就是将其添加到工作副本中。
当您执行类似的操作git add file
时,将其添加到索引中。当你提交它时,你也将它添加到树中。
它可能会帮助您了解以下三个更常见的标志git reset
:
git 重置 [-- <mode>
] [ <commit>
]
此表单将当前分支头重置为<commit>
并可能更新索引(将其重置为 的树<commit>
)和工作树取决于<mode>
,它必须是以下之一:--
soft
完全不触及索引文件或工作树(但将头部重置为<commit>
,就像所有模式一样)。正如 git status 所说,这会使您所有更改的文件都“提交更改”。
--混合
重置索引但不重置工作树(即保留更改的文件但未标记提交)并报告尚未更新的内容。这是默认操作。
- 难的
重置索引和工作树。此后对工作树中跟踪文件的任何更改<commit>
都将被丢弃。
现在,当您执行类似的操作时git reset HEAD
,您实际上正在做的是git reset HEAD --mixed
,它将索引“重置”到您开始添加文件/添加对索引的修改之前的状态(通过git add
)。在这种情况下,无论工作副本的状态是什么,您都没有对其进行任何更改,但是您以一种现在与树的 HEAD 同步的方式更改了索引。是否git add
用于暂存以前提交但已更改的文件,或添加新的(以前未跟踪git reset HEAD
的)文件,与git add
.
git rm
另一方面,从工作目录和索引中删除一个文件,当您提交时,该文件也会从树中删除。git rm --cached
但是,仅从索引中删除文件并将其保存在您的工作副本中。在这种情况下,如果文件先前已提交,那么您将索引与树的 HEAD 和工作副本不同,这样 HEAD 现在具有文件的先前提交版本,索引在全部,并且工作副本具有它的最后修改。现在提交将同步索引和树,并且文件将从树中删除(使其在工作副本中未跟踪)。何时git add
用于添加新的(以前未跟踪的)文件,然后git rm --cached
git add
与(并且几乎相同)完全相反git reset HEAD
。
Git 2.25 为这些情况引入了一个新命令git restore
,但从 Git 2.28 开始,它在手册页中被描述为“实验性”,因为行为可能会改变。