Git push --force-with-lease: безопасно переписать ветку

Категория: Git · Язык: Bash · Обновлено:

git push --force-with-lease переписывает удалённую ветку, но отказывается затирать чужие коммиты: Git проверяет, что удалённая ссылка всё ещё указывает туда, откуда вы начинали. Это безопасная замена --force после rebase или commit --amend. Коммит будет отклонён, если кто-то успел отправить свои изменения.

Отправить переписанную ветку после rebase

Bash
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, сначала посмотрите, что появилось на сервере:

Bash
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 повторно прогоните тесты — хеши коммитов изменились, а конфликты могли разрешиться иначе.

Зафиксировать ожидаемое состояние явно

Bash
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.