Amikor egy már pusholt commitot amendelsz vagy rebase-elsz, force push kell a remote branch frissítéséhez. A sima --force viszont veszélyes: akkor is felülírja a remote branchet, ha közben más pusholt rá. Az ő commitjai ilyenkor elvesznek.

A --force-with-lease ezt úgy védi ki, hogy csak akkor engedi a push-t, ha a remote branch pontosan ott áll, ahol legutóbb láttad: a lokális origin/<branch> ref megegyezik a valódi remote tippel. Ha azóta valaki pusholt rá, a push elbukik, és nem írod felül a változásait.

# veszélyes
git push --force

# biztonságos: "felülírom, de csak ha senki nem nyúlt hozzá"
git push --force-with-lease

Shared branch-en lehetőleg egyáltalán ne force pusholj; ha mégis át kell írnod a történetet, a sima --force helyett ez a minimum.

Amit egy háttérben futó fetch elronthat

A lease a lokális origin/<branch> ref alapján dönt. Ezt a refet egy háttérben lefutó git fetch is frissítheti, például úgy, hogy az IDE a tudtod nélkül lekéri a remote változásokat. Konkrét eset: dolgozol egy branchen, közben egy csapattársad pushol rá. A háttérben lefutó fetch leszedi ezt a commitot, és frissíti vele a lokális origin/<branch> refet — de a commit még nincs beépítve a saját munkádba. Amikor ezután force pusholsz, a Git ezt a frissített refet tekinti „utoljára látott állapotnak”, és engedi a push-t, pedig a csapattársad commitja pont ekkor vész el. Ez nem kapcsolja ki teljesen a védelmet: a fetch óta érkezett, még le sem töltött remote változások ellen továbbra is működik. Ezért fetch után ne force pusholj vakon.

Extra védelem: push.useForceIfIncludes

A Git 2.30 óta ismeri a --force-if-includes opciót. Ezt egy configgal automatikusan hozzáadhatod a --force-with-lease-hez:

git config --global push.useForceIfIncludes true

Ez nem cseréli a --force-ot --force-with-lease-re. A --force-with-lease használatakor viszont a Git azt is ellenőrzi, hogy a remote-tracking branch aktuális commitja elérhető-e a lokális branch valamelyik reflog-bejegyzéséből. Egy háttérben futó fetch így önmagában nem elég ahhoz, hogy a push átmenjen, ha a letöltött állapotot nem építetted be a lokális munkádba.

Ezért a --force-with-lease-t érdemes ezzel a configgal együtt használni. Önmagában egyik kapcsoló sem ad teljes garanciát, együtt azonban csökkentik annak esélyét, hogy észrevétlenül felülírd más munkáját.

A részletes működésről a git push dokumentációjában olvashatsz.