Почему Checkout иногда размещает файл?

Когда я впервые начал использовать Git, я нашел checkout Команда довольно запутанная. Однако, когда я адаптировался к модели управления версиями Git, это стало иметь смысл. Теперь я должен преподавать Git моим коллегам, и я пытаюсь объяснить checkout просто. Я думал, что у меня есть простое объяснение (из документации):

Оформить ветку или пути к рабочему дереву

Это, кажется, объединяет некоторые вещи, которые вы можете сделать с checkout, которые кажутся разнообразным набором операций для кого-то новичка в Git:

git checkout .
git checkout HEAD .
git checkout HEAD~2
git checkout feature/update-readme README.md

... за исключением последнего, потому что это не только обновляет рабочий каталог, но и устанавливает файл в очередь.

Как я могу понять, почему или когда извлечение приведет к тому, что что-то будет поставлено, а не просто скопировано в рабочий каталог?

1 ответ

Решение

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

Как я могу понять, почему или когда извлечение приведет к тому, что что-то будет поставлено, а не просто скопировано в рабочий каталог?

Начиная с Git 2.21 (Q1 2019), вы будете точно знать, когда git checkout изменяет файл (вместо HEAD или ветви): " git checkout [<tree-ish>] path... "научился сообщать о количестве путей, которые были извлечены из индекса или из дерева, что дает ему ту же степень шумности, что и в случае, когда команда проверяет ветвь.

См. Коммит 0f086e6 (13 ноября 2018 г.) Нгуен Тай Нгук Дуй ( pclouds )
(Объединено Юнио С Хамано - gitster - в коммите 4084df4, 14 января 2019 г.)

checkout: напечатать что-нибудь при проверке путей

Одна из проблем с " git checkout "заключается в том, что он делает так много разных вещей и может запутать людей, особенно если мы не справимся с неоднозначностью.

Один из способов справиться с этим - сообщить пользователю, какая операция на самом деле выполняется. При переключении веток мы всегда что-то печатаем, если --quiet, или:

HEAD is now at ..."
Reset branch ..."
Already on ..."
Switched to and reset ..."
Switched to a new branch ..."
Switched to branch ..."

Проверка путей однако молчит.

Напечатайте что-нибудь, чтобы, если мы неправильно поняли намерение пользователя, они не потратили бы слишком много времени, чтобы выяснить это.

Для остальных случаев оформления заказа мы теперь печатаем либо:

Checked out ... paths out of the index
Checked out ... paths out of <abbrev hash>

Поскольку цель печати состоит в том, чтобы помочь устранить неоднозначность, делайте это только тогда, когда -- "отсутствует.

Другие вопросы по тегам