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
змінної конфігурації.