在gitrepo中,如果您触摸文件,为什么之后将其检出?
$ ls -l --time-style=full-iso README.md
-rw-rw-r-- 1 vagrant vagrant 4900 2020-01-16 16:25:41.144000000 +0100 README.md
$ touch README.md
$ ls -l --time-style=full-iso README.md
-rw-rw-r-- 1 vagrant vagrant 4900 2020-01-16 16:26:06.316000000 +0100 README.md
$ git checkout .
$ ls -l --time-style=full-iso README.md
-rw-rw-r-- 1 vagrant vagrant 4899 2020-01-16 16:26:11.960000000 +0100 README.md
git status
不显示文件!
这会导致当前基于请求请求的增量构建出现一些问题。这些文件是二进制相同的:
$ touch README.md
$ cp README.md README.md_touch
$ git checkout .
$ xxd README.md > README.md.hex
$ xxd README.md_touch > README.md_touch.hex
$ diff README.md.hex README.md_touch.hex
[This可能相关,但git diff-index HEAD
对我而言什么都没有显示:
$ git diff-index HEAD
$ touch README.md
$ git diff-index HEAD
$ git checkout .
$ git diff-index HEAD
您使用了git checkout .
(在Git 2.23+中可能用git restore .
更好地表述)。因此,您专门told Git:请在我的工作树的这一部分中覆盖所有跟踪的工作树文件。覆盖内容相同的没关系:您告诉Git覆盖,就这样了。
(Git不接触未更改的文件并非没有道理,在某些签出模式下确实会发生这种情况,并且Git并没有真正承诺会覆盖未更改的文件。因此它可以执行您想要的操作。但是目前,它可以而不是git checkout .
。]
((请记住,索引 aka 临时区域永远不会1为空。当您未从签出的提交版本中更改文件时,索引包含文件的副本2!git checkout .
表示签出索引中的所有文件,用索引中的副本覆盖工作树中的副本。)
1好,几乎没有。如果没有跟踪的文件,则可以有一个空索引。
2从技术上讲,索引保留对Git blob对象的引用,而不是实际副本。不过,这里的效果是相同的。