Git merge vs rebase: verschillen, voorbeelden en wanneer je wat gebruikt

  1. Home
  2. Blog
  3. Softwareontwikkeling
Softwareontwikkeling

Git merge vs rebase: verschillen, voorbeelden en wanneer je wat gebruikt

Git merge vs rebase bepaalt hoe de geschiedenis van je project eruitziet. Zie beide op hetzelfde voorbeeld met echte logoutput, leer de ene regel die rampen voorkomt en kopieer een veilige teamwerkwijze.

7 min leestijd
Git merge vs rebase: verschillen, voorbeelden en wanneer je wat gebruikt
Belangrijkste punten
  • Merge verbindt twee branches met een nieuwe mergecommit en bewaart de geschiedenis precies zoals die gebeurde.
  • Rebase speelt je commits opnieuw af bovenop een andere branch, wat een rechte lijn maar nieuwe hashes geeft.
  • Rebase nooit commits die anderen al hebben opgehaald.
  • Rebase je eigen featurebranch voordat je een pull request opent en gebruik merge als je hem in de hoofdbranch brengt.

Je featurebranch loopt achter op main en je hebt het nieuwe werk nodig. Git merge vs rebase is de keuze tussen twee manieren om dat te krijgen, en beide zijn correct. Ze verschillen in hoe de geschiedenis er daarna uitziet.

We maakten een piepkleine repository, voerden beide commando’s uit en plakten de echte output hieronder, zodat je het resultaat vergelijkt in plaats van het je voor te stellen. Nieuw met Git? Begin met onze Git-tutorial voor beginners (in het Engels).

Wat git merge en git rebase doen

git merge neemt de toppen van twee branches en combineert ze. Hebben beide nieuwe commits, dan maakt Git een mergecommit met twee ouders. Niets wat al bestaat wordt gewijzigd.

git rebase neemt de commits die alleen op jouw branch staan, legt ze opzij, verplaatst je branch naar de top van de andere en speelt je commits dan één voor één opnieuw af. De opnieuw afgespeelde commits zijn nieuwe commits met nieuwe hashes, ook al zijn de wijzigingen gelijk.

Git merge in de praktijk

Ons uitgangspunt: commit A op main, twee commits (F1, F2) op feature en daarna nog een commit (M1) op main. Nu mergen we main in feature.

git switch feature
git merge main
git log --oneline --graph

*   f507aab Merge main into feature
|\
| * 8842fb5 M1
* | 082cc6a F2
* | 5a71e3c F1
|/
* 8766865 A

De grafiek toont het echte verhaal: twee werklijnen die samengevoegd zijn. De oorspronkelijke commits F1 en F2 behouden hun hashes. De prijs is een extra mergecommit, en in een druk project verandert de grafiek in een web.

Git rebase in de praktijk

Zelfde uitgangspunt, maar nu rebasen we feature op main.

git switch feature
git rebase main
git log --oneline --graph

* 1ff474b F2
* bf9149e F1
* 8842fb5 M1
* 8766865 A

De geschiedenis is één rechte lijn, alsof je na M1 met je werk begon. Kijk naar de hashes: F1 was 5a71e3c en is nu bf9149e, en F2 veranderde van 082cc6a in 1ff474b. Git heeft ze herschreven, en daarom vraagt rebase om zorg.

Merge en rebase naast elkaar

AspectMergeRebase
Vorm van de geschiedenisVertakte grafiek met mergecommitsEén rechte lijn
Bestaande commitsOngewijzigdHerschreven met nieuwe hashes
ConflictenEén keer opgelost, in de mergecommitKunnen bij elke opnieuw afgespeelde commit opgelost moeten worden
Veilig op gedeelde branchesJaNee
Het beste voorAfgerond werk in main brengenJe eigen branch bijwerken voor de review

Tip: kun je niet kiezen, vraag dan wie je branch nog meer heeft. Niemand? Dan is rebase veilig. Heeft een collega hem opgehaald, gebruik dan merge.

De gouden regel van rebase

Rebase geen commits die buiten je eigen repository bestaan. Na een rebase komt je branch niet meer overeen met de kopie op de server, dus pushen vraagt om een force. Heeft een collega werk op de oude commits gebouwd, dan botst zijn geschiedenis nu met de jouwe, en dat uitzoeken is pijnlijk.

Je eigen privé-featurebranch rebasen is prima. main of een branch die anderen gebruiken rebasen niet.

Een veilige teamwerkwijze

Deze routine houdt de geschiedenis schoon zonder iemand te verrassen. Het is ook wat de meeste teams gebruiken vóór hun CI-pipeline, zoals die in onze gids voor GitHub Actions CI/CD (in het Engels).

git switch feature
git fetch origin
git rebase origin/main        # or: git pull --rebase
# fix conflicts, then: git add <file> && git rebase --continue
git push --force-with-lease   # only on your own branch

--force-with-lease weigert de serverbranch te overschrijven als iemand sinds je laatste fetch heeft gepusht, wat een gewone --force stilletjes zou vernietigen. Is de pull request goedgekeurd, merge hem dan in main.

Een mislukte rebase ongedaan maken

Een rebase lijkt destructief, maar de oude commits blijven een tijd in de reflog van Git staan, dus je kunt terug.

git reflog                    # find the commit before the rebase
git reset --hard HEAD@{5}     # example position, check reflog first

Maak vóór elke risicovolle rebase een back-upbranch met git branch backup, dan is herstel één commando. Draai je daarnaast een database of tools in containers? Bekijk onze Docker-tutorial voor beginners (in het Engels).

Tot slot

Merge bewaart de waarheid, rebase houdt haar netjes. Gebruik rebase om je eigen branch te verversen, merge om hem op te leveren en herschrijf nooit een geschiedenis waar anderen van afhangen.

Veelgestelde vragen

Wat is het verschil tussen git merge en git rebase?

Merge combineert twee branches met een mergecommit en behoudt alle bestaande commits. Rebase verplaatst je commits bovenop een andere branch en herschrijft ze, wat een lineaire geschiedenis geeft.

Moet ik merge of rebase gebruiken?

Rebase je eigen featurebranch om bij te blijven en merge als je hem oplevert in een gedeelde branch zoals main. Gebruik merge zodra anderen de branch delen.

Is git rebase gevaarlijk?

Op privébranches is het veilig, op gedeelde branches riskant, omdat het commit-hashes herschrijft. Gebruik een back-upbranch en de reflog om te herstellen als er iets misgaat.

Wat doet force-with-lease?

Het forceert alleen de push als de remote branch nog staat waar je hem het laatst zag, zodat je nieuwe commits van een collega niet per ongeluk overschrijft.

Verwijdert rebase mijn commits?

Nee. Het maakt nieuwe commits met dezelfde wijzigingen en de oude blijven in de reflog staan tot Git ze opruimt.

Blijf leren (Engelstalige artikelen)

Werk samen met Stack Quora

Hulp nodig bij testen, WordPress of SEO?

We helpen teams betere software op te leveren en hun sites te laten groeien. Vertel ons waar je mee bezig bent en we stellen een duidelijke volgende stap voor.

Blijf lezen

Meer handleidingen over testen, AI en moderne ontwikkeling

Genoten van dit artikel? Kies een onderwerp en ga direct naar onze nieuwste tutorials.

Kunstmatige intelligentie

AI-hallucinaties uitgelegd: waarom taalmodellen dingen verzinnen en hoe ze te verminderen

AI-hallucinaties uitgelegd: wat ze zijn, waarom taalmodellen ze produceren, veelvoorkomende typen, hoe je ze kunt verminderen met aarding en aanwijz…

Lees artikel →
DevOps

Omgevingsvariabelen uitgelegd: .env-bestanden, geheimen en configuratie goed gedaan

Omgevingsvariabelen uitgelegd met Python-voorbeelden die we hebben uitgevoerd: ze lezen en instellen, waarom elke waarde een string is, .env-bestand…

Lees artikel →
Softwareontwikkeling

API-snelheidsbeperking uitgelegd: algoritmen, headers en afhandeling van 429-fouten

API-snelheidsbeperking uitgelegd met een simulatie die we hebben uitgevoerd: token-bucket, vast venster, schuifvenster, 429 reacties, headers van sn…

Lees artikel →
Testautomatisering

Spotten in Python: unittest.mock, patch en de fouten die tests doen liegen

Spotten in Python met unittest.mock, getest: Mock en return_value, side_effect, patchen waar een naam wordt gebruikt, spec en autospec, spotdatums e…

Lees artikel →
Softwaretesten

Codedekking uitgelegd: lijn versus filiaaldekking en wat 100% werkelijk betekent

Codedekking uitgelegd met een echte dekking.py-run: dekking van lijnen, vertakkingen en condities, een rapport lezen, waarom 100% dekking nog steeds…

Lees artikel →
Databases & SQL

DELETE versus TRUNCATE versus DROP in SQL: verschillen, terugdraaien en wanneer elk te gebruiken

DELETE versus TRUNCATE versus DROP uitgelegd met geteste SQL: wat elk verwijdert, terugdraaien, triggers, identiteitsreset, snelheid en hoe PostgreS…

Lees artikel →
Databases & SQL

SQL-weergaven uitgelegd: creëer, gebruik en vermijd de valkuilen, met voorbeelden

SQL-weergaven uitgelegd met query's die we hebben uitgevoerd: een weergave maken, live resultaten, kolommen verbergen, prestaties, bijwerkbare en ge…

Lees artikel →
Softwareontwikkeling

TypeScript-interface versus type: echte verschillen, getest met de compiler

TypeScript-interface versus type, gecontroleerd met de echte compiler: wat beide kunnen doen, wat slechts één kan doen, samenvoegen van declaraties,…

Lees artikel →
Softwareontwikkeling

Python *args en **kwargs uitgelegd: flexibele functies met duidelijke voorbeelden

Python *args en **kwargs uitgelegd met code die we hebben uitgevoerd: in- en uitpakken, parametervolgorde, argumenten die alleen trefwoorden en posi…

Lees artikel →
Softwareontwikkeling

Python Lambda-functies: syntaxis, echt gebruik en wanneer u ze niet moet gebruiken

Python lambda-functies uitgelegd met code die we hebben uitgevoerd: syntaxis, sorteren met sleutel, kaart en filter, sluitingen, de laat-bindende va…

Lees artikel →
Kunstmatige intelligentie

Wat zijn AI-agenten? Hoe ze werken, met een eenvoudige agentloop die u kunt uitvoeren

Wat zijn AI-agenten? Een duidelijke gids voor de agentenlus, tools, geheugen en vangrails, met een kleine Python-lus die we hebben uitgevoerd, echte…

Lees artikel →
DevOps

Monitoring versus waarneembaarheid: het echte verschil, met logboeken, statistieken en sporen

Monitoring versus waarneembaarheid uitgelegd: bekende en onbekende fouten, logboeken, statistieken en sporen, een walkthrough voor afrekenincidenten…

Lees artikel →
DevOps

Docker-volumes versus bindingsmounts: bewaar containergegevens op de juiste manier

Docker-volumes versus bind-mounts uitgelegd: waarom containergegevens verdwijnen, benoemde volumes, bind-mounts, tmpfs, Compose-voorbeelden, back-up…

Lees artikel →
Testautomatisering

TDD versus BDD: belangrijkste verschillen, één functie die op beide manieren is gebouwd en wanneer deze moet worden gebruikt

TDD versus BDD uitgelegd met één kortingsfunctie die in beide richtingen is gebouwd: rood-groen-refactor met code die we hebben uitgevoerd, gegeven-…

Lees artikel →
Softwareontwikkeling

Git merge vs rebase: verschillen, voorbeelden en wanneer je wat gebruikt

Git merge vs rebase uitgelegd met echte logoutput, een vergelijkingstabel, de gouden regel van rebase en een veilige teamwerkwijze.

Lees artikel →
Softwareontwikkeling

Python list comprehension: syntaxis, voorbeelden en wanneer je het vermijdt

Python list comprehension uitgelegd: syntaxis, filteren, if-else, geneste lussen, gemeten tijden en wanneer een gewone for-lus beter is.

Lees artikel →
Databases & SQL

SQL JOIN uitgelegd met voorbeelden (Inner, Left, Right, Full)

Begrijp SQL joins stap voor stap met voorbeeldtabellen en queries: INNER, LEFT, RIGHT, FULL, CROSS en SELF, plus veelgemaakte fouten en prestatietips.

Lees artikel →