为什么结帐和重置会更改索引?

时间:2014-01-11 18:42:55

标签: git

我认为索引仅适用于您为下次提交暂存的文件,但重置和结帐都会更新索引:

git checkout

  

要准备工作,请通过更新工作树中的索引和文件来切换到它,

3 个答案:

答案 0 :(得分:5)

  • git reset只能更改HEADgit 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 checkoutgit reset更改当前提交,则必须更改索引,以允许您更改它以创建新提交。

答案 2 :(得分:1)

这个想法是git总是提交当前状态的快照而不仅仅是差异。因此,在进行结账时,索引将更新为包含您刚检出的快照,然后您可以更改添加文件/更改。

我的问题是因为我在错误的假设下操作,只会将更改添加到索引中。