Я переживаю, що я можу забути про цю вишукану особливість наступного разу, коли мені це буде потрібно.
Git 2.13 (Q2 2017) пояснює, чому немає "захисту" від забуття цієї опції push, тому що навіть якщо ви цього не зробите забудете його на git pushрівні, він все одно може бути проігнорований.
Див. Комісію f17d642 (19 квітня 2017 р.) Від Ævar Arnfjörð Bjarmason ( avar) .
(Об’єднав Хуніо С Хамано - gitster- в комітці 46bdfa3 , 26 квітня 2017 р.)
push: документ і тест --force-with-lease з кількома видаленнями
Документ і тест для випадків, коли два пульти вказують на одну і ту ж URL-адресу, а також фонове отримання та наступне git push --force-with-lease не повинно перекручувати оновлені посилання, які ми не отримали.
Деякі редактори, такі як VSC Майкрософт, мають функцію автоматичного вибору у фоновому режимі, це обходить захист, пропонований --force-with-lease&--force-with-lease=<refname> , як зазначено в доданій тут документації.
Тож документація наgit push наразі включає:
загальна примітка щодо безпеки: надання цього варіанта без очікуваного значення, тобто як --force-with-leaseабо --force-with-lease=<refname>
дуже погано взаємодіє з усім, що неявно працюєgit fetch на пульті дистанційного керування, щоб пересунути його у фоновому режимі, наприклад, git fetch origin
у вашому сховищі під час роботи.
Захист, який він пропонує --force , забезпечує те, що наступні зміни, на яких не ґрунтувалася ваша робота, не халопуються, але це тривіально зазнає поразки, якщо якийсь фоновий процес оновлює рефлекси у фоновому режимі. У нас немає нічого, окрім інформації про віддалене відстеження, щоб пройти як евристику для рецензій, які, як ви очікували, побачили, і які готові пограбувати.
Якщо ваш редактор або якась інша система працює git fetchу фоновому режимі, для вас спосіб пом'якшити це просто встановити інший пульт:
git remote add origin-push $(git config remote.origin.url)
git fetch origin-push
Тепер, коли фоновий процес запускається, git fetch originпосилання на origin-pushоновлення не оновлюються, а отже, такі команди:
git push --force-with-lease origin-push
Не вдасться, якщо ви не запустите вручну git fetch origin-push.
Цей метод, звичайно, повністю переможений чимось запущеним git fetch
--all, у цьому випадку вам потрібно буде або відключити його, або зробити щось більш виснажливе, як-от:
git fetch # update 'master' from remote
git tag base master # mark our base point
git rebase -i master # rewrite some commits
git push --force-with-lease=master:base master:master
Тобто створіть baseтег для версій висхідного коду, які ви бачили та готові перезаписати, потім перепишіть історію та, нарешті, примушуйте натиснути зміни, masterякщо віддалена версія все ще є base, незалежно від того, до remotes/origin/masterчого оновлено вашу локальну версію в тло.
rmщобrm -iв вашому .bashrc; ви забудете і видалите важливий файл на сервері одного дня. Поїхати з власним псевдонімом не має такої проблеми :)