git push --force-with-lease безопаснее, чем git push --force, потому что перед перезаписью ветки проверяет, что на сервере она всё ещё указывает на тот же коммит, который вы видели при последнем git fetch/git pull. Если кто-то успел запушить новые коммиты, операция отклоняется, и вы не затираете чужую историю. git push --force всегда безоговорочно переписывает удалённую ветку и легко может удалить работу других разработчиков.
Обе команды, git push --force и git push --force-with-lease, используют, когда вы переписали историю (например, сделали git rebase или git commit --amend) и хотите навязать удалённой ветке новое состояние. Разница в том, что --force просто говорит: «сделай на сервере так же, как у меня сейчас, не важно, что там было», а --force-with-lease сначала проверяет: «серверная ветка всё ещё в том состоянии, которое я видел в последний раз?».
Технически git push --force-with-lease сравнивает текущий коммит удалённой ветки с вашим локальным tracking-рефом origin/<branch>. Если реф совпадает, Git считает, что за это время никто другой в эту ветку не пушил, и разрешает перезапись. Если же удалённая ветка уже указывает на другой коммит, push прерывается ошибкой, и вы явно видите, что кто-то успел внести изменения.
Разницу в поведении удобно запомнить так:
git push --force: безусловно переписывает удалённую ветку текущим состоянием вашей локальной ветки, игнорируя любые новые коммиты на сервере; легко можно стереть чужую работу.git push --force-with-lease: переписывает удалённую ветку только если она не изменилась с момента вашего последнего git fetch/git pull; при расхождении веток push отклоняется, заставляя вас сначала синхронизироваться и явно решить, как объединять историю.Ниже приведён пример, показывающий, как одна и та же ситуация выглядит при использовании жёсткого перезаписывающего push и более безопасного варианта с проверкой состояния удалённой ветки.
В типичном командном процессе, если git push --force-with-lease завершается с ошибкой, это сигнал, что ветка уже обновлена кем-то ещё: нужно сделать git fetch или git pull, просмотреть новые коммиты, при необходимости выполнить rebase или merge и только потом снова попытаться выполнить перезаписывающий push.
Часто разработчики настраивают себе более безопасный алиас, чтобы по привычке не использовать голый --force и всегда иметь защиту от случайного удаления чужих коммитов.
На практике git push --force разумно использовать только в ветках, где вы точно единственный автор (например, личные временные ветки или форки). Во всех общих ветках, которыми пользуется команда, предпочтительнее применять git push --force-with-lease: он даёт ту же возможность переписать историю, но добавляет важный уровень защиты от случайного затирания чужих изменений.
Отметьте свой прогресс