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

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

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

Кажется, это объединяет некоторые вещи, которые вы можете делать с помощью checkout, которые кажутся разнообразным набором операций для тех, кто плохо знаком с Git:

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

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

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


person Keith Pinson    schedule 03.03.2015    source источник
comment
Ваша последняя строка эквивалентна git checkout feature/update-readme -- README.md.   -  person joeytwiddle    schedule 13.11.2015
comment
Я упоминаю об этом только потому, что -- более явно отделяет commitRef от имен файлов/путей, поэтому мне так понятнее. (На самом деле ваша вторая касса также может иметь --.)   -  person joeytwiddle    schedule 13.11.2015
comment
Возможный дубликат Почему `git checkout ‹branch› ‹file› ` внести изменения?   -  person phuclv    schedule 03.11.2017
comment
@LưuVĩnhPhúc мой вопрос предшествует этому. Это дубликат этого, а не наоборот.   -  person Keith Pinson    schedule 03.11.2017
comment
@KeithPinson общее правило состоит в том, чтобы оставить тот, у которого лучший набор ответов, а не старый   -  person phuclv    schedule 03.11.2017


Ответы (2)


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

person wonce    schedule 03.03.2015

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

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

См. commit 0f086e6 (13 ноября 2018 г.) от Нгуен Тай Нгок Зуй (pclouds).
(объединено Хунио С. Хамано -- gitster -- в commit 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>

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

Однако: "git checkout [<tree-ish>] <pathspec>" начал сообщать о количестве недавно обновленных путей, но те же сообщения были выданы, когда "git checkout -m <pathspec>" не разрешал только что разрешенные конфликты.
Теперь сообщение сообщает об этих неразрешенных путях отдельно от путей. которые извлечены из индекса.

См. commit 1d1f689, коммит 3c5883b (06 февраля 2019 г.), автор Нгуен Тай Ngọc Duy (pclouds).
(Объединено Junio ​​C Hamano -- gitster --< /a> в commit 87c9831, 9 февраля 2019 г.)

checkout: считать и печатать -m путей отдельно

Поскольку 0f086e6 (checkout: напечатать что-нибудь при проверке путей - 13.11.2018) , эта команда сообщает, сколько путей было обновлено из какого источника (либо из дерева, либо из индекса).
Я забыл, что есть третий источник: когда используется -m, конфликт слияния создается повторно (предоставляется , тоже из индекса, но это не прямая копия из индекса).

Необъединенные пути подсчитывайте и сообщайте отдельно.
Есть еще одно обновление, чтобы избежать отчетов:

Recreated X merge conflicts
Updated 0 paths from the index

Вторая строка не нужна. Хотя, если нет воссоздания конфликта, мы все равно сообщаем

Updated 0 paths from the index

чтобы было ясно, что мы на самом деле ничего не делаем.

person VonC    schedule 20.01.2019