Cursus
Versiebeheer is een van de belangrijkste aspecten van moderne softwareontwikkeling. Het stelt je in staat om wijzigingen bij te houden, efficiënt samen te werken en de codegeschiedenis te behouden. Van de verschillende beschikbare tools springt Git eruit als een van de meest gebruikte systemen voor het beheren van codewijzigingen.
Zoals je zult ontdekken in onze cursus Introductie tot Git, biedt Git branching om aan verschillende features of fixes te werken zonder de hoofdcodebasis te beïnvloeden. Hoewel branching de ontwikkeling flexibeler maakt, kan het soms een uitdaging zijn om branches overzichtelijk te houden. Daar komt Git rebase bij kijken.
Git-branches begrijpen
Zoals we verkennen in onze gids voor Git en GitHub, stellen branches je in staat om onafhankelijk van de hoofdcodebasis aan nieuwe features of bugfixes te werken. Ze bieden een geïsoleerde omgeving waarin je wijzigingen kunt aanbrengen zonder lopend werk in andere branches te verstoren.
Er zijn verschillende veelgebruikte branching-workflows, waaronder:
- Feature-branches: Deze worden gebruikt om nieuwe functionaliteit te ontwikkelen voordat ze in de main-branch worden gemerged.
- Release-branches: Deze zijn bedoeld om code te stabiliseren voorafgaand aan een nieuwe release.
- Hotfix-branches: Deze worden aangemaakt om kritieke issues te verhelpen.
Het effectief beheren van deze branches is cruciaal om een schone en georganiseerde codegeschiedenis te behouden.

Wat is Git rebase?
Git rebase is een opdracht waarmee je commits van de ene branch naar een andere kunt verplaatsen of opnieuw kunt toepassen. In tegenstelling tot mergen, waarbij een nieuwe commit wordt gemaakt die wijzigingen uit verschillende branches combineert, past rebasen de wijzigingen één voor één toe op de doelbranch. Dit resulteert in een lineaire geschiedenis zonder onnodige merge-commits.
Bij een rebase neemt Git elke commit van de bronbranch en past deze toe boven op de nieuwste commit in de doelbranch. Dit maakt de commitgeschiedenis makkelijker te lezen en te volgen. We gaan dieper in op hoe je de volledige commitgeschiedenis van een repository kunt bekijken in onze Git Diff-gids.

Waarom Git rebase gebruiken?
Rebasen is om meerdere redenen nuttig:
- Een lineaire commitgeschiedenis creëren. In plaats van een geschiedenis met meerdere merge-commits, houdt rebasen het commitlog schoon en makkelijk te begrijpen.
- Samenwerking en code review verbeteren. Een duidelijke commitgeschiedenis helpt teams om wijzigingen effectiever te beoordelen.
- Onnodige merge-commits vermijden. Door te rebasen in plaats van te mergen, kun je branches bijwerken zonder het commitlog vol te laten lopen.
Toch kan rebasen risicovol zijn, vooral bij gedeelde branches, omdat het de commitgeschiedenis herschrijft en conflicten kan veroorzaken of het moeilijker kan maken om wijzigingen te volgen. Het is het beste om het rebasen van publieke branches te vermijden en het voorzichtig te gebruiken in samenwerkingsworkflows.
Wanneer Git rebase gebruiken
Er zijn een paar situaties waarin Git rebase de juiste keuze is. We hebben ze hieronder elk in detail bekeken.
Lokale feature-branches rebasen
Als je aan een feature-branch werkt, is het gebruikelijk om deze bij te werken met de laatste wijzigingen uit de main-branch. Rebasen, waarbij de commits van de feature-branch boven op de meest recente main-branch worden geplaatst, helpt een schone commitgeschiedenis te behouden als alternatief voor mergen.
Feature-branches up-to-date houden
Wanneer meerdere ontwikkelaars aan dezelfde repository werken, verandert de main-branch vaak. Rebasen helpt de feature-branch bij te werken zonder onnodige merge-commits toe te voegen.
Rebasen in teamsamenwerking
In teamverband kan rebasen helpen om conflicten te voorkomen voordat ze optreden. Door een feature-branch regelmatig op de main-branch te rebasen, kun je wijzigingen stapsgewijs integreren en zo de kans op mergeconflicten later verkleinen.
Stapsgewijze gids voor Git rebase
In deze sectie nemen we je mee door het proces van rebasen met Git, met een stapsgewijze gids voor alles wat je moet weten.

Voorbereiden op een rebase
Zorg ervoor dat de werkdirectory schoon is voordat je met een rebase begint. Dit betekent dat je wijzigingen commit of stash voordat je gaat rebasen.

Controleer ook of je op de juiste branch staat door het volgende uit te voeren:
git branch
De laatste wijzigingen ophalen
Zorg er vóór het rebasen voor dat de lokale repository de laatste wijzigingen van de remote repository heeft:
git fetch origin
Overschakelen naar de feature-branch
Ga naar de feature-branch die gerebased moet worden:
git checkout your-feature-branch
Rebasen op de main-branch
Om de commits van de feature-branch boven op de nieuwste main-branch toe te passen, voer je uit:
git rebase main
Git zal elke commit van de feature-branch opnieuw toepassen op de bijgewerkte main-branch.

Wanneer je git rebase main uitvoert, neemt Git de wijzigingen uit de main-branch en past deze toe vóór de commits van je feature-branch. Zo blijft je geschiedenis schoon en lineair. Dit proces speelt je commits opnieuw af op de nieuwste staat van main, wat resulteert in een lineaire projectgeschiedenis zonder merge-commits.
Stel bijvoorbeeld dat de main-branch de commits A en B heeft. Je feature-branch is vanaf A afgesplitst en bevat commits C en D.
A---B (main)
\
C---D (feature)
Na git rebase main is je feature-branch bijgewerkt met de commits van main, gevolgd door jouw commits:
---B---C'---D' (feature)
Hier zijn C en D nieuwe commits die je oorspronkelijke wijzigingen vertegenwoordigen, nu gebaseerd op B.
Conflicten oplossen (indien aanwezig)
Als er tijdens het rebasen conflicten ontstaan, pauzeert Git en kun je ze oplossen.
Markeer de conflicten als opgelost zodra ze zijn gefixt:
git add .
git rebase --continue
Indien nodig kun je de rebase afbreken met:
git rebase --abort
De rebase voltooien
Controleer na een geslaagde rebase de branch en test de code om zeker te zijn dat alles correct werkt.
Interactief rebasen in Git
Naast het gebruikelijke rebasen uit de vorige sectie kun je ook interactief rebasen. Dit geeft je meer controle, zoals je hieronder zult ontdekken.
Wat is interactieve rebase?
Interactieve rebase git rebase -i stelt je in staat commits te wijzigen voordat je ze toepast. Deze modus biedt opties zoals herordenen, bewerken, squashen en verwijderen van commits.
Waarom interactief rebasen gebruiken?
Interactief rebasen is handig om de commitgeschiedenis te verfijnen. Het helpt meerdere commits te combineren, commitberichten te bewerken en onnodige commits te verwijderen voordat je in de main-branch merged.
Veelvoorkomende toepassingen van interactieve rebase
- Commits herordenen. Verander de volgorde van de commits om de geschiedenis duidelijker te maken.
- Meerdere commits squashen. Combineer verschillende kleine commits tot één betekenisvolle commit.
- Commitberichten bewerken. Pas commitberichten aan voordat je wijzigingen pusht. Het is belangrijk om passende commitberichten te schrijven om duidelijk te maken wat er in de code is bijgewerkt, zoals we laten zien in onze tutorial over Git push en pull.
Hoe voer je een interactieve rebase uit
Om een interactieve rebase te starten, voer je uit:
git rebase -i HEAD~n
Vervang n door het aantal commits dat je wilt wijzigen. De interactieve interface laat je kiezen hoe je met elke commit omgaat.
Best practices en aandachtspunten
Bij rebasen is het belangrijk om enkele best practices te volgen. Laten we er in deze sectie een paar bespreken.
Vermijd rebasen van gedeelde branches
Een branch rebasen waar anderen aan werken kan conflicten en verwarring veroorzaken. Als een gedeelde branch al is gepusht, vermijd dan om deze te rebasen.
Regelmatig fetchen en rebasen
Een feature-branch up-to-date houden met de laatste wijzigingen uit de main-branch helpt conflicten voorkomen en maakt mergen soepeler.
Back-up maken vóór rebasen
Omdat rebasen de commitgeschiedenis wijzigt, is het goed om vooraf een back-up te maken. Met git stash of door een tijdelijke branch aan te maken, voorkom je per ongeluk gegevensverlies.
Veelvoorkomende valkuilen en hoe je ze vermijdt
Laten we kijken naar enkele veelvoorkomende uitdagingen bij rebasen en hoe je ze vermijdt.
Per ongeluk een publieke branch rebasen
Een branch rebasen die al gedeeld is, kan conflicten veroorzaken voor andere bijdragers. Als dit gebeurt, gebruik dan git reflog om verloren commits terug te vinden.
Moeite met het oplossen van conflicten
Wanneer er conflicten optreden, neem de tijd om ze zorgvuldig op te lossen. Tools zoals git mergetool kunnen het proces eenvoudiger maken.
Commitgeschiedenis kwijtraken
Als commits verdwijnen na een rebase, gebruik dan git reflog om ze te vinden en te herstellen.
Conclusie
Git rebase is een krachtige tool om een schone commitgeschiedenis te behouden en samenwerking te verbeteren. Door het correct te gebruiken—vermijd het rebasen van gedeelde branches, fetch regelmatig updates en maak back-ups van wijzigingen—kun je versiebeheer stroomlijnen en mergeconflicten verminderen.
Pas deze technieken toe om je repositories georganiseerd en je workflows efficiënt te houden. Wil je je Git-kennis verdiepen? Bekijk onze cursus Intermediate Git om de fundamenten van Git voor versiebeheer in je software- en dataprojecten te ontdekken.
Git rebase: veelgestelde vragen
Wat is het verschil tussen Git rebase en Git merge?
Git merge maakt een nieuwe commit die de wijzigingen van twee branches combineert en behoudt beide geschiedenissen. Git rebase daarentegen verplaatst de commits van de ene branch en past ze achtereenvolgens toe op een andere, wat resulteert in een lineaire commitgeschiedenis zonder extra merge-commits.
Wanneer moet ik Git rebase gebruiken in plaats van Git merge?
Gebruik Git rebase wanneer je een schone en lineaire commitgeschiedenis wilt behouden, vooral voor feature-branches. Het is vooral nuttig vóórdat je een feature-branch in de main-branch merged om onnodige merge-commits te vermijden. Vermijd echter het rebasen van gedeelde branches, omdat dit de commitgeschiedenis herschrijft en problemen kan veroorzaken voor samenwerkers.
Wat gebeurt er als ik conflicten tegenkom tijdens een Git rebase?
Als er tijdens het rebasen een conflict optreedt, pauzeert Git en vraagt het je om de conflicten op te lossen. Je moet de conflicterende bestanden handmatig herstellen, ze stage'en met git add ., en vervolgens de rebase vervolgen met git rebase --continue. Als de conflicten te complex zijn, kun je de rebase annuleren met git rebase --abort en opnieuw beginnen.
Is het veilig om een branch te rebasen die al naar een remote repository is gepusht?
Nee, het rebasen van een branch die al is gepusht en gedeeld met anderen kan problemen opleveren omdat het de commitgeschiedenis herschrijft. Als je toch een gedeelde branch moet rebasen, communiceer dan met je team en gebruik git push --force-with-lease zorgvuldig om te voorkomen dat je iemands wijzigingen overschrijft.
Hoe kan ik een Git rebase ongedaan maken als er iets misgaat?
Als je merkt dat een rebase problemen heeft veroorzaakt, kun je met git reflog de vorige commit vóór de rebase vinden en deze herstellen met git reset --hard <commit-hash>. Een andere optie is git rebase --abort gebruiken als de rebase nog bezig is en nog niet is voltooid.
