Git 2.21 (Q1 2019, 4+ роки пізніше) пояснить повідомлення про помилку та внесе пропозиції
" git checkout frotz" ( без жодної подвійної риски, яку я пропонував спочатку ), уникає двозначності, переконуючись, що ' frotz' не може бути інтерпретовано як перегляд і як шлях одночасно .
Ця безпека була оновлена, щоб також перевірити унікальну гілку віддаленого відстеження ` frotz` у пульті дистанційного керування, коли dwimming створює локальну гілку ' frotz' з гілки віддаленого відстеження ' frotz' з пульта.
Примітка: "dwim" (використовується нижче) означає "робити те, що я маю на увазі" , коли комп'ютерна система намагається передбачити те, що мають намір зробити користувачі, виправляючи тривіальні помилки автоматично, а не сліпо виконуючи явні, але потенційно неправильні дані користувача.
Див. Коміт be4908f (13 листопада 2018 р.) Нгуєна pcloudsТхая Нгюка Дуя ( ) .
(Об’єднано Junio C Hamano - gitster- у комітеті 8d7f9db , 04 січня 2019)
checkout: усунути неоднозначність гілок відстеження dwim та локальних файлів
Коли dwim checkout додається у коміті 70c9ac2 , він обмежується лише dwim, коли виконуються певні умови, інакше повертається до поведінки перевірки за замовчуванням.
Виявляється, падіння назад може заплутати.
Одна з умов повернути
git checkout frotz
до
git checkout -b frotz origin/frotz
це те, що frotzне повинно існувати як файл.
Але коли користувач очікує " git checkout frotz" створення гілки " frotz" і там трапляється файл із назвою " frotz", git тихо повертає frotzвміст файлу " " не допомагає .
Про це повідомляється в списку розсилки Git і навіть використовується як приклад "Git - це погано" в інших місцях .
Зазвичай ми намагаємось робити правильно, але коли є кілька "правильних речей", найкраще залишити це за рішенням користувача.
Перевірте цей випадок, попросіть користувача не визначити:
- "
git checkout -- foo" перевірить шлях "foo"
- "
git checkout foo --" буде dwim і створить гілку " foo" 6
Для користувачів, які не хочуть dwim, використовуйте --no-guess. У цьому конкретному випадку це марно, оскільки " git checkout --no-guess foo --" просто не вдасться.
Але його могли використовувати сценарії.
Наразі сторінкаgit checkout керівництва включає:
--no-guess:
Не намагайтеся створити гілку, якщо існує віддалена гілка відстеження з однойменною назвою.
До Git 2.26 (І квартал 2020 р.) " git checkout X" Неправильно зазнав помилки, коли Xне є локальною гілкою, але міг назвати кілька гілок віддаленого відстеження (тобто бути розміщеною як початкову точку для створення відповідної локальної гілки), яка була виправлений.
Див. Коміт fa74180 , коміт 2957709 (30 грудня 2019 р.) Олександром Мілославським ( SyntevoAlex) .
(Об’єднано Junio C Hamano - gitster- у комітеті d0e70cd , 05 лютого 2020)
checkout: не повертати файл на неоднозначних гілках відстеження
Підписав: Олександр Мілославський
Для кращого розуміння, ось такі хороші сценарії:
- Не мають файлу `
foo`, немає локальної гілки ' foo' та жодної віддаленої гілки ' foo'
git checkout fooстворить локальну гілку foo, див. коміт 70c9ac2 вище , обговорений тут .
і
- Є в файл «
foo», немає місцевого відділення « foo» і одного віддаленого філії « foo»
git checkout fooбуде скаржитися, див. коміт be4908f вище
Цей патч запобігає наступному сценарію:
- Є в файл «
foo», немає місцевого відділення « foo» і кілька віддалених філій « foo»
git checkout fooбуде успішно ... повернути вміст файлу foo!
Тобто додавання іншого пульта дистанційного керування раптово істотно змінює поведінку, що в кращому випадку є несподіванкою, а в гіршому може залишитися непоміченим для користувача.
Будь ласка, зверніться до комітету be4908f вище , який містить деякі скарги у реальному світі.
Наскільки я розумію, виправлення у коміті be4908f вище ( обговорювалося тут ) не враховувало випадок декількох пультів дистанційного керування, і вся поведінка повернення до файлу, що повертає, ніколи не передбачалася:
коміт 70c9ac2 вище вводить несподівану поведінку.
Раніше був запасний варіант з not-a-ref на pathspec. Це розумний резервний варіант.
Згодом є ще один відкат від неоднозначно-віддаленого до pathspec.
Я розумію, що це було недоглядання копіювання та вставлення.
зафіксуйте ad8d510 з " Неможливо зробити замовлення з кількома пультами " і обговорювали тут , помітив несподівану поведінку, але вирішив напівдокументувати її, а не забороняти, оскільки мета серії виправлень була зосереджена на чомусь іншому.
коміт be4908f вище додає, die()коли між гілкою та файлом є неоднозначність.
Випадки декількох гілок відстеження, мабуть, не враховуються.
Нова поведінка: якщо немає локальної гілки та декількох віддалених кандидатів, просто die()не намагайтеся повернути файл, чи існує він (запобігає сюрпризу) чи ні (покращує повідомлення про помилку) .
З Git 2.30 (Q1 2021) " git checkout" ( людина ) навчився використовувати checkout.guessзмінну конфігурації та відповідно ввімкнути / вимкнути її --[no-]guessопцію.
Див. Коміт 64f1f58 (07 жовтня 2020 р.) Та коміт ef09e7d (06 жовтня 2020 р.) Дентона Лю ( Denton-L) .
(Об’єднано Junio C Hamano - gitster- у комітеті 0e41cfa , 27 жовтня 2020)
checkout: навчись поважати checkout.guess
Підписав: Дентон Лю
Поточна поведінка git checkout/switch, яка --guessв даний час увімкнена за замовчуванням.
Однак деякі користувачі можуть не бажати, щоб це відбувалося автоматично.
Замість того, щоб змушувати користувачів --no-guessкожного разу вказувати вручну, навчіть ці команди checkout.guessзмінної конфігурації, яка дає користувачам можливість встановити поведінку за замовчуванням.
Навчіть сценарій завершення розпізнавати нову змінну конфігурації та вимкнути логіку DWIM, якщо для неї встановлено значення false.
git configтепер включає в свою довідкову сторінку :
checkout.guess
Надає значення за замовчуванням для параметра --guessабо --no-guess
в git checkoutі git switch. Дивіться
git switchі git checkout.
git checkoutтепер включає в свою довідкову сторінку :
--guessє поведінкою за замовчуванням. Використовуйте --no-guessдля його вимкнення.
Поведінку за замовчуванням можна встановити за допомогою checkout.guessзмінної конфігурації.
git switchтепер включає в свою довідкову сторінку :
Поведінку за замовчуванням можна встановити за допомогою checkout.guessзмінної конфігурації.