Git push --force-with-lease: безопасно переписать ветку
git push --force-with-lease переписывает удалённую ветку, но отказывается затирать чужие коммиты: Git проверяет, что удалённая ссылка всё ещё указывает туда, откуда вы начинали. Это безопасная замена --force после rebase или commit --amend. Коммит будет отклонён, если кто-то успел отправить свои изменения.
Отправить переписанную ветку после rebase
git fetch origin
git rebase origin/main
git push --force-with-lease --force-if-includes origin feature/login--force-if-includes появился в Git 2.30 и закрывает гонку с фоновым git fetch: одной проверки lease недостаточно, если remote-tracking ref уже обновился, но чужие коммиты ещё не влиты в вашу ветку. Вместе опции разрешают push только тогда, когда удалённая верхушка действительно учтена локально.
Если push отклонён сообщением про stale info, сначала посмотрите, что появилось на сервере:
git fetch origin
git log --oneline --left-right HEAD...origin/feature/login
git rebase origin/feature/login
git push --force-with-lease --force-if-includes origin feature/loginНе выполняйте git push --force вместо разбора расхождения: он молча удалит коммиты коллеги. После rebase повторно прогоните тесты — хеши коммитов изменились, а конфликты могли разрешиться иначе.
Зафиксировать ожидаемое состояние явно
git push \
--force-with-lease=feature/login:"$(git rev-parse origin/feature/login)" \
origin feature/loginЯвная форма позволяет указать точный SHA, который вы видели. Она полезна в скриптах, где remote-tracking ref мог обновиться между проверкой и отправкой. Пустое ожидаемое значение требует, чтобы ветки на сервере ещё не было.
Никогда не применяйте force-варианты к общей ветке main или к ветке, из которой уже собирают релиз. Защита ветки на стороне сервера всё равно может отклонить push; это нормальный предохранитель, а не повод обходить правила.
Документация: git push, git rebase.