Layer 8Ehrlicher Tech-Support
SoftwareSchweregrad: LästigNot possible to fast-forward, aborting.

git pull: Not possible to fast-forward, aborting

git pull bricht ab, sobald eigener und entfernter Zweig auseinandergelaufen sind. Laut Git 2.55 ist --ff-only die Voreinstellung, nicht der Merge.

Aufwand:
ca. 10 Min.
Voraussetzung:
Ein Terminal mit git, Die Git-Konfiguration (git config), lokal oder global, Zugang zum entfernten Repository
Gilt für:
Git 2.55.0 (Dokumentation von git-pull auf git-scm.com, Stand 17.10.2026): --ff-only ist Voreinstellung, wenn keine Methode für auseinandergelaufene Zweige gewählt ist

Das Symptom

git pull, das seit Jahren wortlos seinen Dienst tat, bricht ab. Die Meldung lautet sinngemäß, ein Fast-Forward sei nicht möglich, und endet mit aborting. Nichts wurde geholt, nichts zusammengeführt, der Arbeitsbaum ist unverändert. Besonders beliebt ist die Meldung nach einem Git-Update, in einem frischen Container oder auf einem neuen Rechner, auf dem die alte Konfiguration fehlt. Der Kollege nebenan bekommt sie nicht.

Die Reflexe reichen von git reset –hard über das Löschen und Neuklonen des Repositorys bis zum verzweifelten git push –force, der dann anderen Leuten die Arbeit wegnimmt.

Die „Layer 8“-Wahrheit

Git hat nichts kaputtgemacht; es hat eine Entscheidung verweigert. Die Dokumentation von git pull zählt vier Wege auf, den entfernten Zweig in den eigenen zu integrieren: –ff-only, –rebase, –no-rebase (ein Merge) und –squash. Zum ersten steht dort, dass git pull –ff-only nur Fast-Forward-Aktualisierungen vornimmt und „fails if your local branch has diverged from the remote branch.“ Der nächste Satz ist der entscheidende: „This is the default.“ Bei der Option selbst heißt es noch einmal: „This is the default when no method for reconciling divergent histories is provided (via the –rebase flags).“

Ein Fast-Forward ist nur möglich, wenn die entfernte Geschichte eine Fortsetzung der eigenen ist; dann wandert der Zweigzeiger einfach nach vorn, ohne neuen Commit. Hat man selbst Commits gemacht, die der Server nicht kennt, und hat der Server Commits, die man selbst nicht kennt, gibt es zwei Möglichkeiten, die Zweige zu vereinen: Merge oder Rebase. Welche davon, ist Geschmack, Teamkonvention und Frage, ob die eigenen Commits schon veröffentlicht sind. Git weiß das nicht und rät nicht. Deshalb der Abbruch.

Die Dokumentation nennt auch den Weg, die Frage ein für alle Mal zu beantworten: „You can also set the configuration options pull.rebase, pull.squash, or pull.ff with your preferred behaviour.“ Wer die Meldung auf einem Rechner nie gesehen hat, hat dort mit großer Wahrscheinlichkeit pull.rebase gesetzt, vielleicht vor Jahren, vielleicht aus einem Blogartikel abgetippt. Auf dem neuen Rechner fehlt die Zeile, und das strenge Standardverhalten kommt zum Vorschein.

Zur Wahl selbst gibt die Dokumentation eine klare Warnung mit: Rebase schreibt Geschichte um, und das bekommt veröffentlichten Commits nicht. Für Arbeit, die noch auf keinem Server liegt, ist Rebase die saubere Variante mit linearer Geschichte; für geteilte Zweige ist der Merge die ehrliche. Für pull.rebase sind die Werte true, merges, false und interactive dokumentiert; false bedeutet Merge. Die Entscheidung dauert eine Minute. Die Alternativen, Neuklonen oder Force-Push, kosten im besten Fall Zeit und im schlechtesten die Commits eines anderen. Die Meldung ist der Moment, in dem Git fragt. Man sollte antworten, nicht ausweichen.

Die echte, verifizierte Lösung

1000 % faktenbasiert. Jeder Befehl ist real, jeder Pfad existiert. Schritt für Schritt:

  1. 1.

    Lage prüfen

    git status zeigt nach einem Fetch, wie viele Commits der eigene Zweig vor und hinter dem Upstream liegt. Steht dort beides, sind die Zweige auseinandergelaufen, und die Meldung ist erklärt. git log mit beiden Spitzen zeigt, welche Commits auf welcher Seite liegen. Erst danach entscheidet man, ob die eigenen Commits oben drauf sollen (Rebase) oder ein Merge-Commit entstehen darf.

    git fetch
    git status
    git log --oneline --left-right HEAD...@{upstream}
    
  2. 2.

    Einmalig entscheiden: Rebase

    Mit --rebase holt git pull den entfernten Stand und setzt die eigenen, noch nicht veröffentlichten Commits darauf um. Die Dokumentation beschreibt für --rebase=true, dass der aktuelle Zweig nach dem Fetch auf den Upstream-Zweig umgesetzt wird; sie weist zugleich darauf hin, dass Rebase die Geschichte umschreibt und für bereits veröffentlichte Commits nicht geeignet ist. Für lokale Arbeit auf einem eigenen Zweig ist das die übliche Wahl. Konflikte lassen sich mit git rebase --abort gefahrlos abbrechen.

    git pull --rebase
    
  3. 3.

    Einmalig entscheiden: Merge

    Mit --no-rebase führt git pull einen Merge aus, so wie es ältere Anleitungen voraussetzen. Es entsteht ein Merge-Commit, in dem beide Geschichten zusammenlaufen; nichts wird umgeschrieben. Das ist die richtige Wahl, wenn die eigenen Commits schon gepusht wurden oder das Team Merge-Commits ausdrücklich will. Bei Konflikten bricht git merge --abort den Vorgang ab, ohne Spuren zu hinterlassen.

    git pull --no-rebase
    
  4. 4.

    Dauerhaft festlegen

    Damit die Frage nicht bei jedem Pull neu gestellt wird, setzt man pull.rebase in der Konfiguration: true für Rebase, false für Merge. Mit --global gilt das für alle Repositorys des Benutzers, ohne den Schalter nur für das aktuelle. Wer die strenge Voreinstellung behalten und nur im Einzelfall entscheiden will, lässt alles, wie es ist, und gibt die Option beim jeweiligen Pull mit. git config --show-origin zeigt, aus welcher Datei ein gesetzter Wert stammt, falls das Verhalten zwischen Rechnern abweicht.

    git config --global pull.rebase true
    git config --show-origin pull.rebase
    

Häufige Fragen (FAQ)

?Was bedeutet die Meldung, dass kein Fast-Forward möglich ist?

Dass der eigene Zweig und der entfernte Zweig beide neue Commits haben, die der jeweils andere nicht kennt. Ein Fast-Forward verschiebt nur den Zweigzeiger nach vorn; das geht nur, wenn die entfernte Geschichte ein Nachfahre der eigenen ist. Die Dokumentation von git pull beschreibt die Voreinstellung so: git pull --ff-only macht nur Fast-Forward-Aktualisierungen, es „fails if your local branch has diverged from the remote branch.“ Und direkt danach: „This is the default.“ Die Meldung ist also keine Beschädigung, sondern die Weigerung, ohne Anweisung zu entscheiden, wie die beiden Geschichten zusammengeführt werden sollen.

?Früher hat git pull einfach gemergt. Was hat sich geändert?

Die Voreinstellung. Laut aktueller Dokumentation gibt es vier Hauptwege, den entfernten Zweig einzubinden: --ff-only, --rebase, --no-rebase (Merge) und --squash. Zur Option --ff-only steht: „Only update to the new history if there is no divergent local history. This is the default when no method for reconciling divergent histories is provided (via the --rebase flags).“ Wer das alte Verhalten will, muss den Merge ausdrücklich wählen, per Option --no-rebase oder dauerhaft per Konfiguration. Ein Skript oder eine Anleitung, die stillschweigend auf den Merge setzt, läuft mit aktuellem Git auf diese Meldung.

?Merge oder Rebase, was soll ich einstellen?

Das ist eine Entscheidung des Teams, keine technische. Rebase setzt die eigenen Commits auf die entfernte Spitze um und hält die Geschichte linear; die Dokumentation warnt bei --rebase ausdrücklich, dass dieser Modus die Geschichte umschreibt und nicht gut ausgeht, wenn diese Geschichte schon veröffentlicht wurde. Merge erzeugt einen Merge-Commit und lässt alles stehen. Für Commits, die noch nie gepusht wurden, ist Rebase meist die sauberere Wahl; für gemeinsam genutzte Zweige der Merge. Die Konfiguration pull.rebase nimmt laut Dokumentation die Werte true, merges, false und interactive entgegen.

?Warum erscheint die Meldung nur bei mir und nicht beim Kollegen?

Weil der Kollege entweder eine ältere Git-Version benutzt oder pull.rebase beziehungsweise pull.ff in seiner Konfiguration gesetzt hat, womöglich vor Jahren und längst vergessen. Die Dokumentation nennt genau diese Variablen als Weg, das bevorzugte Verhalten festzulegen: „You can also set the configuration options pull.rebase, pull.squash, or pull.ff with your preferred behaviour.“ Ein Blick in git config --show-origin pull.rebase zeigt, aus welcher Datei die Einstellung stammt.

Belege

Diese Seite ist gegen die folgenden Primärquellen geprüft – Hersteller, Standard oder Gesetzestext. Wer es nicht glaubt, muss es nicht: Da steht, wo es nachzulesen ist.

Zuletzt geprüft am . Dokumentation altert – ein Datum daneben ist der einzige ehrliche Umgang damit.

Auch zu finden unter

Verwandte Fehler

SWLästig! [rejected] (non-fast-forward)

git push rejected: non-fast-forward beheben

git push wird mit '! [rejected] non-fast-forward' abgelehnt? Die Remote hat Commits, die dir fehlen. So holst du sie sauber nach und pushst gefahrlos.

SWLästigCONFLICT

Git: Merge-Konflikt (CONFLICT)

Git meldet einen Konflikt beim Zusammenführen? Beide Seiten haben dieselbe Stelle geändert. Git kann nicht raten, welche gilt — das entscheidest du.

SWAnfängerfehlerYour local changes would be overwritten

git: local changes would be overwritten by merge

git stoppt mit 'Your local changes would be overwritten by merge/checkout'? So rettest du deine Änderungen per commit oder stash, statt sie zu verlieren.