答案 0 :(得分:5)
git reset
只能更改HEAD
(git reset --soft
),或HEAD
和索引(默认),或HEAD
索引和工作树({{1} }})。git checkout
只能在切换分支时更改索引,以便您开始根据该分支的内容暂存您的工作。 That discussion指出了checkout更改索引的原因:
我对索引的理解是它是中间人:
- 将工作树中的东西移动到对象存储
- 用于将事物从对象存储区移动到工作树。
因此,当您签出blob时,它首先会从对象存储区复制到索引,然后从索引复制到工作树。
torek提到in the comments反映同一主题另一部分的内容:
请注意,您可以使用
git show
提取文件来绕过索引写入:
git reset --hard
将覆盖
git show HEAD~3:file > file
的工作目录版本,非常类似于file
,,但不会更新索引。
我在“How to retrieve a single file from specific revision in Git?”中详细介绍了git checkout HEAD~3 -- file
。
另请注意,git show
不会对文件应用过滤器(涂抹/清除或任何自定义过滤器)。
答案 1 :(得分:1)
清理结账或重置后,HEAD的内容与索引和工作树的内容相同。
之后您通常会更改工作树,然后使用git add
更新索引,最后使用git commit
将结果索引转换为提交。
索引与您的工作树非常相似:您可以从内容当前提交开始更改某些文件,最后将结果设置为提交。
如果使用git checkout
或git reset
更改当前提交,则必须更改索引,以允许您更改它以创建新提交。
答案 2 :(得分:1)
这个想法是git总是提交当前状态的快照而不仅仅是差异。因此,在进行结账时,索引将更新为包含您刚检出的快照,然后您可以更改添加文件/更改。
我的问题是因为我在错误的假设下操作,只会将更改添加到索引中。