发布于 2014-01-11 20:06:02
其思想是,git总是提交当前状态的快照,而不仅仅是差异。因此,在进行签出时,将更新索引,以包含您刚刚签出的内容的快照,然后更改添加的文件/更改。
我的问题是,我是在错误的假设下操作的,即只有更改才会添加到索引中。
发布于 2014-01-11 18:54:48
HEAD (git reset --soft)、HEAD和索引(默认)或HEAD索引和工作树(git reset --hard)。那次讨论指出了签出更改索引的原因:
我对指数的理解是,它是中间派:
因此,当您签出blob时,它首先从对象存储复制到索引,然后从索引复制到工作树。
请注意,您可以通过使用
git show提取文件来绕过索引的写入:
git show HEAD~3:file > file 将覆盖
file的工作目录版本,就像git checkout HEAD~3 -- file一样,但不会更新索引。
我在“git show”中更详细地介绍了如何从Git中的特定修订中检索单个文件?。
还要注意的是,git-show没有将过滤器应用于文件(污点/清除或任何自定义过滤器)。
发布于 2014-01-11 18:51:43
清理检查或重置后,HEAD的内容与索引和工作树的内容相同。
之后,通常更改工作树,然后使用git add更新索引,最后使用git commit将结果索引转换为commit。
索引的工作原理与工作树非常相似:从内容、当前提交开始,更改一些文件,最后将结果变为提交。
如果使用git checkout或git reset更改当前提交,则索引必须更改,以允许您更改它以创建新提交。
https://stackoverflow.com/questions/21066364
复制相似问题