linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it works
  • Уроки
  • База знаний
  • Собеседование
home/git/how/force-push-lease

how/совместная работа

force push: --force vs --force-with-lease

Зачем существует --force-with-lease, как именно он защищает от затирания чужих коммитов, и почему фоновый fetch может его обмануть. Три зоны, пять сценариев.

git push --force - один из тех инструментов, который не надо использовать, пока не понимаешь, что он делает. Затирает удалённую историю своей молча, даже если кто-то запушил туда после тебя. Один неудачный push - и чужие коммиты исчезают из общего remote'а.

git push --force-with-lease - безопасный аналог: проверяет, что удалённая ветка - та же, что ты последний раз видел через git fetch. Если нет - отказывается.

Чтобы это работало, в Git'е существует три зоны, не две:

  • local repo - твой клон, с твоим feat.
  • refs/remotes/origin/feat (он же remote-tracking ref) - локальный кэш того, какой SHA был на remote при последнем fetch. Это не remote, это твоё представление о remote.
  • origin · remote - сам сервер, актуальное состояние.

Жми ▶ - посмотрим, как эти три ссылки расходятся и почему одна из них может тебя предать.

step 1/5·00 · всё совпадает - обычный push работает
LOCAL REPOтвой клонORIGIN/FEATremote-tracking ref (кэш)ORIGIN · REMOTEреальный серверfeatSHAaaa1111refs/remotes/origin/featSHAaaa1111featSHAaaa1111git push✓ acceptedвсё совпадает - обычный fast-forward push работает, никакого force не нужно

§ шаги

  1. Базовая ситуация. Ты только что сделал коммит на feat, rebase не делал, никто другой в feat не пушил.

    local feat              = X
    origin/feat (tracking)  = X
    remote feat             = X

    git push идёт как обычный fast-forward: твой local ушёл на один коммит вперёд, remote - предок. Никакого force здесь не нужно, никаких ловушек.

    С этого начинаются все три зоны: local, origin/feat, remote. Дальше будем смотреть, как они расходятся.

итого

Что важно запомнить:

  • --force затирает remote молча. Если между твоим последним fetch и push кто-то закоммитил в эту же ветку - его коммит исчезает, никаких предупреждений.
  • --force-with-lease берёт SHA из твоего refs/remotes/origin/feat (что ты последний раз видел) и сравнивает с реальным SHA на remote'е. Расходятся - отказ «stale info», чужой коммит спасён.
  • Фоновый fetch ломает lease. Если IDE, watcher или параллельный терминал успел сделать fetch без тебя - refs/remotes/origin/feat молча обновился до чужого свежего SHA. Lease совпадает с remote, force проходит, чужой коммит затёрт.
  • От тихого fetch'а спасает явный SHA в lease: git push --force-with-lease=feat:<sha>, где <sha> - тот, который ты сам видел и осознанно решил перезаписать. Сравнение идёт с этим SHA, а не с remote-tracking ref.
  • На main/master force-push должен быть запрещён branch protection'ом - страховка снизу, чтобы ничьи случайные пальцы не дотянулись.

Правило для пальцев: никогда --force, всегда --force-with-lease. Удобно завести алиас:

bash
git config --global alias.pushf 'push --force-with-lease'

§ копнуть в базу знаний

  • force-pushforce push - правила и подводные камни
  • pushpush - обычный non-force случай
  • fetchfetch - откуда берётся origin/feat
  • tracking-branchtracking branch - что такое refs/remotes/...
  • rebaserebase - типичная причина force-push'а
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки