为什么git checkout不变但被触摸的文件?

问题描述 投票:0回答:1

在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 touch
1个回答
0
投票

您使用了git checkout .(在Git 2.23+中可能用git restore .更好地表述)。因此,您专门told Git:请在我的工作树的这一部分中覆盖所有跟踪的工作树文件。覆盖内容相同的没关系:您告诉Git覆盖,就这样了。

(Git不接触未更改的文件并非没有道理,在某些签出模式下确实会发生这种情况,并且Git并没有真正承诺会覆盖未更改的文件。因此它可以执行您想要的操作。但是目前,它可以而不是git checkout .。]

((请记住,索引 aka 临时区域永远不会1为空。当您未从签出的提交版本中更改文件时,索引包含文件的副本2git checkout .表示签出索引中的所有文件,用索引中的副本覆盖工作树中的副本。


1好,几乎没有。如果没有跟踪的文件,则可以有一个空索引。

2从技术上讲,索引保留对Git blob对象的引用,而不是实际副本。不过,这里的效果是相同的。

© www.soinside.com 2019 - 2024. All rights reserved.