Wanneer je werkt aan een gedeelde Git-repository, kun je soms de foutmelding "fatal: Not possible to fast-forward, aborting" tegenkomen. Dit gebeurt wanneer je lokale branch en de remote branch zijn gesplitst, wat betekent dat de remote branch nieuwe commits heeft die niet in je lokale branch zitten. In dit artikel bekijken we de stappen om deze fout op te lossen en bespreken we enkele goede gewoontes om dit in de toekomst te voorkomen.
Oplossing
Stap 1: Haal de laatste wijzigingen op van de remote branch
Om de foutmelding "fatal: Not possible to fast-forward, aborting" op te lossen, gebruik je het commando git fetch om de laatste wijzigingen op te halen uit de remote repository. git fetch werkt je lokale kopie van de remote branch bij zonder de wijzigingen in je huidige branch te mergen. Hierdoor kun je de nieuwe commits op de remote branch zien zonder je lokale branch aan te passen.
git fetch origin
Dit commando haalt de laatste wijzigingen op van de remote repository met de naam "origin".
Stap 2: Controleer het verschil tussen lokale en remote branches
Nadat je de laatste wijzigingen hebt opgehaald, gebruik je git status om de huidige status van je lokale branch te bekijken. Vergelijk de head van je lokale branch met de head van de remote branch. Dit helpt je om eventuele conflicterende wijzigingen tussen de branches te vinden. Als de remote branch nieuwe commits heeft die niet in je lokale branch zitten, moet je die wijzigingen toevoegen.
git status
De output toont je de huidige branch, de link met de remote branch en eventuele uncommitted wijzigingen.
Stap 3: Kies een manier om remote wijzigingen toe te voegen
Er zijn twee gangbare manieren om remote wijzigingen toe te voegen aan je lokale branch: mergen en rebasen.
git mergecombineert de remote wijzigingen met je lokale wijzigingen en maakt een nieuwe merge commit aan.git rebaseplaatst je lokale commits bovenop de remote wijzigingen, wat een lineaire geschiedenis oplevert zonder merge commit.
Kies de manier die het beste werkt voor jouw situatie en ontwikkelworkflow.
| Methode | Beschrijving | Wanneer te gebruiken |
|---|---|---|
git merge |
Combineert remote wijzigingen met lokale wijzigingen en maakt een merge commit | - Bij het werken aan een gedeelde branch - Om de commit history te bewaren |
git rebase |
Plaatst lokale commits bovenop remote wijzigingen, wat een lineaire geschiedenis oplevert | - Bij het werken aan een feature branch - Voor een nette commit history |
Stap 4a: Merge remote wijzigingen met git merge
Als je kiest voor git merge, voer je het commando git merge <remote-branch> uit om de remote wijzigingen in je lokale branch te mergen. Als er conflicterende wijzigingen zijn, vraagt git je om de merge conflicts handmatig op te lossen. Na het oplossen van de conflicten, stage je de wijzigingen en maak je een nieuwe commit aan om het merge proces af te ronden. Dit maakt een merge commit aan in de geschiedenis van je branch.
git merge origin/main
Dit commando merget de wijzigingen van de remote branch "origin/main" in je huidige lokale branch.
Stap 4b: Rebase lokale commits bovenop remote wijzigingen met git rebase
Als je de voorkeur geeft aan git rebase, voer je het commando git pull --rebase uit om je lokale commits bovenop de remote wijzigingen te rebasen. Dit past je lokale commits één voor één toe bovenop de head van de remote branch. Als er conflicterende wijzigingen zijn tijdens het rebase proces, pauzeert git en laat je de conflicten voor elke commit oplossen. Na het oplossen van de conflicten, ga je verder met het rebase proces totdat alle commits zijn toegepast. Rebasen zorgt voor een lineaire geschiedenis zonder merge commit.
git pull --rebase
Dit commando haalt de laatste wijzigingen op van de remote repository en rebaset je lokale commits daarbovenop.
Stap 5: Push de bijgewerkte lokale branch naar de remote repository
Zodra je de remote wijzigingen succesvol hebt gemerged of gerebaset in je lokale branch, gebruik je het commando git push om de bijgewerkte lokale branch naar de remote repository te pushen. Hierdoor worden je wijzigingen beschikbaar voor andere ontwikkelaars die aan dezelfde branch werken. Als je git rebase hebt gebruikt, moet je mogelijk git push --force gebruiken om de remote branch te overschrijven met je gerebasete lokale branch.
git push origin main
Dit commando pusht de wijzigingen van je lokale branch naar de remote branch met de naam "main" op de "origin" repository.
Oorzaak
Wat veroorzaakt deze git-fout?
De foutmelding "fatal: Not possible to fast-forward, aborting" treedt op wanneer je lokale branch en de remote branch zijn gesplitst. Dit betekent dat de remote branch nieuwe commits heeft die niet in je lokale branch zitten. Wanneer dit gebeurt, kan git geen fast-forward merge uitvoeren.
Een fast-forward merge is alleen mogelijk wanneer je lokale branch direct achterloopt op de remote branch wat betreft commit history. Als je lokale branch commits heeft die de remote branch niet heeft, of als de remote branch commits heeft die je lokale branch niet heeft, kan git geen fast-forward merge uitvoeren.
Hier is een diagram dat de situatie illustreert:
E[Local Branch] --> B
E --> F[Commit 4]
In dit voorbeeld heeft de remote branch commits 1, 2 en 3, terwijl de lokale branch commits 1 en 4 heeft. Omdat de branches zijn gesplitst, is een fast-forward merge niet mogelijk.
Wat is een fast-forward merge in git?
Een fast-forward merge is een type merge dat plaatsvindt wanneer je huidige branch een voorouder is van de branch die je probeert te mergen. Met andere woorden, de branch waarin je merget is niet gesplitst van je huidige branch.
Bij een fast-forward merge verplaatst git simpelweg de pointer van je huidige branch naar de laatste commit van de branch die je merget. Dit is mogelijk omdat er geen conflicterende wijzigingen zijn tussen de branches.
Hier is een voorbeeld van een fast-forward merge:
E[Branch B] --> C
In dit geval kan Branch B fast-forward worden naar de laatste commit van Branch A (Commit 3) omdat Branch B direct achterloopt op Branch A wat betreft commit history.
Fast-forward mergen is niet mogelijk wanneer de branches zijn gesplitst, wat betekent dat beide branches unieke commits hebben die de andere branch niet heeft.
Waarom breekt git het merge proces af?
Git breekt het merge proces af om verlies van commit history te voorkomen. Als git de merge zou laten doorgaan ondanks het feit dat de branches zijn gesplitst, zou dit kunnen leiden tot het verlies van commits van één van de branches.
Door de merge af te breken, handhaaft git de integriteit van de commit history van je repository. Het voorkomt het aanmaken van een merge commit die belangrijke wijzigingen uit beide branches zou kunnen verliezen.
In plaats van automatisch de gesplitste branches te mergen, vereist git dat je de remote wijzigingen in je lokale branch integreert met behulp van git merge of git rebase. Op deze manier heb je controle over hoe de wijzigingen worden toegevoegd en kun je eventuele conflicten oplossen die tijdens het proces ontstaan.
Hier is een tabel die de redenen samenvat waarom git het merge proces afbreekt:
| Reden | Uitleg |
|---|---|
| Voorkom verlies van commit history | Het afbreken van de merge voorkomt het verlies van commits uit beide branches |
| Behoud repository integriteit | Voorkomt het aanmaken van een merge commit die belangrijke wijzigingen zou kunnen verliezen |
| Vereist expliciete integratie | Geeft de gebruiker controle over het toevoegen van wijzigingen en het oplossen van conflicten |
Door de merge af te breken en expliciete integratie te vereisen, zorgt git ervoor dat je je bewust bent van de gesplitste branches en beslissingen kunt nemen over hoe je verder gaat met het mergen van de wijzigingen.
Beste praktijken
Houd je lokale branch up-to-date met de remote branch
Om de foutmelding "fatal: Not possible to fast-forward, aborting" te voorkomen, is het belangrijk om je lokale branch up-to-date te houden met de remote branch. Hier zijn enkele stappen die je kunt volgen:
-
Haal de laatste wijzigingen op van de remote branch:
git fetch -
Merge of rebase de wijzigingen in je lokale branch:
- Met merge:
git merge origin/main - Met rebase:
git pull --rebase
- Met merge:
Overweeg om deze commando's regelmatig uit te voeren, vooral voordat je nieuw werk begint of je wijzigingen naar de remote repository pusht. Door je lokale branch gesynchroniseerd te houden met de remote branch, minimaliseer je het risico om de foutmelding "fatal: Not possible to fast-forward, aborting" tegen te komen.
Voorbeeld workflow
Gebruik branching en pull requests voor gezamenlijke ontwikkeling
Om gezamenlijke ontwikkeling te verbeteren en conflicten te verminderen, gebruik je een branching strategie en pull requests:
- Maak aparte branches aan voor verschillende features, bugfixes of experimenten
- Werk aan de feature branch en commit wijzigingen lokaal
- Push de feature branch naar de remote repository
- Maak een pull request aan om de wijzigingen in de main branch te mergen
- Review, bespreek en test de wijzigingen tijdens het pull request proces
- Los eventuele conflicten of problemen op voordat je merget
- Merge de pull request in de main branch





