繁体   English   中英

为什么 git checkout 未更改但触及文件?

[英]Why does git checkout unchanged but touched files?

在 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

可能是相关的,但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 . )。 所以你特别告诉Git:请在我的工作树的这一部分覆盖我所有跟踪的工作树文件。 覆盖是否具有相同的内容并不重要:您告诉 Git 覆盖,它确实做到了。

(Git 不接触未更改的文件并不是没有道理的,并且在某些结帐模式中确实会发生这种情况,并且 Git 并没有真正承诺覆盖未更改的文件。所以它可以做你想做的事。但目前,它改为这样做. 所以不要使用git checkout . ..)

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


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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM