覆盖文件和检查文件之间的区别是什么?

时间:2016-01-14 11:00:16

标签: git

我的git存储库今天进入了一个奇怪的状态。 $daysInYear = 365; if ($d->format('L') === 1) { // Returns 1 if leap year. $daysInYear = 366; } $daysLeft = $daysInYear - $dayOfYear; 报告的文件已修改,但git status未显示任何更改。在互联网上搜索之后,我检查了文件属性(读/写/执行和所有者GID / UID)和内容(如果是行结尾问题)。属性已正确设置,git diffmd5sum theFile报告了相同的哈希值。

然后我尝试使用存储在git:git show HEAD:theFile | md5sum中的文件覆盖工作树文件。令人惊讶的是,git show HEAD:theFile > theFile继续报告此文件的更改。

然后,我检查了文件:git status,之后,git checkout -- theFile改变了意见并报告git status没有变更。

我无法理解theFileshow HEAD:theFile > theFile之间的区别。也许git将信息保存在缓存中,由checkout -- theFile而不是checkout更新?

1 个答案:

答案 0 :(得分:1)

As I detailed here

git checkout <tree-ish> -- <pathspec>
  

当给出<paths>时,git checkout不会切换分支   它从索引文件或命名的<tree-ish>(通常是提交)更新工作树中的命名路径。

     

这意味着git checkout -- path使用已经上演的内容覆盖工作树(git add&#39; ed)。

git checkout -- theFile使索引和工作树相同,这意味着git diff为空。

show HEAD:theFile > theFile不会修改索引,因此git diff仍会报告索引与工作树之间的差异。