EMZETT.
Login

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

  1. Holen und integrieren: git pull --rebase (lineare Historie) oder git pull (Merge-Commit). Konflikte lösen, dann git push.
  2. Zuerst ansehen: git fetch und git log HEAD..origin/main, was auf dem Server neu ist.
  3. 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).
  4. Auf gemeinsam genutzten Branches (main, develop) nie erzwingen; abstimmen oder per Pull Request arbeiten.
  5. Falschen Branch? git branch -vv zeigt 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