Почему git извлекает неизмененные, но затронутые файлы? - PullRequest
0 голосов
/ 16 января 2020

В 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

1 Ответ

1 голос
/ 16 января 2020

Вы использовали git checkout . (что в Git 2.23+ возможно лучше сформулировать как git restore .). Таким образом, вы сказали Git: , пожалуйста, перезапишите все мои отслеженные файлы рабочего дерева в этой части моего рабочего дерева. Неважно, что перезапись с тем же содержание: вы сказали Git перезаписать, так оно и было.

(Для Git было бы неразумно не трогать неизмененные файлы, и существуют режимы проверки, где это происходит, а Git не не обещаю перезаписывать неизмененные файлы. Поэтому он может делать то, что вы хотели. Но в настоящее время он делает это вместо этого. Поэтому не используйте git checkout ..)

(Помните, индекс aka область подготовки никогда не бывает 1 пустой. Если вы не изменили файл из версии, которая была в извлеченном вами коммите, индекс будет содержать копию 2 файла! git checkout . означает проверить все файлы в индексе, перезаписав копии в рабочем дереве копиями из индекса. )


1 Ну, вряд ли когда-либо. Вы можете иметь пустой индекс, если у вас нет отслеживаемых файлов.

2 Технически, индекс содержит ссылки на объекты Git blob, а не на реальные копии. Эффект здесь тот же, хотя.

...