Git: push rejected (non-fast-forward)
Kurz: Der Server hat Commits, die du lokal nicht hast; Git lehnt den Push ab, bis du die fremden Änderungen geholt und integriert hast.
Genauer: Meldung: ! [rejected] main -> main (fetch first) oder (non-fast-forward), dazu Updates were rejected because the remote contains work that you do not have locally. Git schützt vor dem Überschreiben fremder Commits.
Im Detail
Ursachen
- Jemand anderes (oder du von einem zweiten Gerät) hat nach deinem letzten Abgleich gepusht.
- Du hast lokal die Historie verändert (Rebase, Amend, Reset) und die Branch-Spitze passt nicht mehr zum Server.
- Falscher Branch oder Remote.
Lösungswege
- Holen und integrieren:
git pull --rebase(lineare Historie) odergit pull(Merge-Commit). Konflikte lösen, danngit push. - Zuerst ansehen:
git fetchundgit log HEAD..origin/main, was auf dem Server neu ist. - Nach bewusstem Umschreiben der Historie auf einem eigenen Branch:
git push --force-with-lease(sicherer als--force, prüft, dass der Server unverändert ist). - Auf gemeinsam genutzten Branches (main, develop) nie erzwingen; abstimmen oder per Pull Request arbeiten.
- Falschen Branch?
git branch -vvzeigt den Upstream.
Merkhilfe
--force überschreibt blind und kann Arbeit anderer vernichten. --force-with-lease bricht ab, falls der Server inzwischen neue Commits hat. Teile vorab dem Team mit, bevor du Historie auf geteilten Branches änderst. Geschützte Branches (Branch Protection) verbieten Force-Push in vielen Teams ganz.
Siehe auch: Merge-Konflikt lösen, Git: not a git repository