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