Cursus
Wat is een Git-mergeconflict?
Het versiebeheersysteem Git draait om samenwerken en bijdragen aan projecten. Developers werken meestal op geïsoleerde branches en wanneer ze klaar zijn, mergen ze de wijzigingen met de main-branch. Dit soort teamwork is zeer productief en effectief in het vinden van bugs. Soms werken meerdere developers aan dezelfde regel code en wanneer ze proberen te mergen, ontstaan er conflicten.

Eenvoudig voorbeeld van een Git-conflict
Het diagram hierboven geeft een perfect voorbeeld van hoe een typisch Git-mergeconflict ontstaat. De main-branch heeft een bestand met de tekst “HELLO, WORLD!”. De gebruiker abid fork-t de main-branch en verandert de tekst in “HELLO, CAT!”. Terwijl abid wijzigingen aanbrengt, wordt de oorspronkelijke main-branch ook aangepast naar “HELLO, DOG!”. Het mergen van deze branches leidt tot een mergeconflict en stopt het proces.
De primaire taak van het commando git merge is om twee branches te combineren en conflicten automatisch op te lossen. Toch komen er soms conflicten naar boven wanneer twee personen dezelfde regel code hebben gewijzigd of kritieke bestanden hebben verwijderd waar een andere developer aan werkte. Git markeert deze wijzigingen en stopt het mergeproces. In dat geval is het conflict niet automatisch opgelost; de developer moet handmatig wijzigen of tools gebruiken om het conflict op te lossen.
Soorten merges
Git merge en rebase zijn de twee manieren om commits van de targetbranch in de sourcebranch te integreren. Bovendien voert Git merge ofwel een fast-forward of een no-fast-forward merge uit. Als de head van de targetbranch in de sourcebranch bestaat, is het standaard een fast-forward merge; ontbreekt die, dan wordt het een no-fast-forward merge. Git rebase is een ander type merge dat de commithistorie van de targetbranch herordent.
Fast-forward merge

Standaard gebruikt Git merge fast-forward om ontbrekende commits in de targetbranch te integreren. Zo wordt het bijvoorbeeld gebruikt om de lokale branch te updaten vanaf een remote server met het pull-commando. Fast-forward veroorzaakt geen mergeconflicten, omdat Git het niet toepast als de head van de targetbranch ontbreekt in de sourcebranch.
No-fast-forward merge

Een no-fast-forward merge wordt ook wel een three-way of true merge genoemd. Het maakt een nieuwe commit op een targetbranch door wijzigingen in zowel de source- als targetbranch te integreren. De wijzigingen worden samengevoegd na de laatste gemeenschappelijke commit in beide branches. In ons geval is dat na C. Dit type merge leidt tot een Git mergeconflict als de sourcebranch in strijd is met de targetbranch. In het diagram hierboven wordt de mergecommit (X) gemaakt door de source- en targetbranch te integreren, waarbij K en E de ouders van de mergecommit zijn.
Rebase

Git rebase werkt net even anders dan andere typen. Het verandert de volgorde van de commithistorie van de targetbranch. De rebase integreert de sourcebranch zo dat de targetbranch alle wijzigingen uit de sourcebranch bevat, gevolgd door alle commits van de targetbranch na de laatste gemeenschappelijke commit. In ons geval is de laatste gemeenschappelijke commit C, terwijl D en E uit de sourcebranch komen. De commit K* is dezelfde als K met een andere commit-id. In plaats van C te linken, linkt hij naar E. Net als bij een no-fast-forward merge zal Git bij compatibiliteitsproblemen tussen de source- en targetbranch vragen om conflicten op te lossen voordat de rebase kan worden afgerond.
Types Git-mergeconflicten
Er zijn twee soorten Git-mergeconflicten: aan het begin en tijdens het mergeproces - Atlassian. In deze sectie behandelen we beide typen en manieren om elk scenario op te lossen.
Aan het begin van de merge
Git merge zal aan het begin falen als er wijzigingen zijn in de working directory of de staging area. Het faalt vroeg om te voorkomen dat wijzigingen worden overschreven door binnenkomende mergecommits. Dit gebeurt door conflicten met lokale wijzigingen, niet met andere branches of developers. Om de lokale staat te stabiliseren, kun je commando’s gebruiken zoals git stash, git commit, git checkout of git reset.
Tijdens de merge
Een fout tijdens de merge betekent dat er een conflict is tussen de source- en targetbranch waarbij meerdere developers hetzelfde bestand hebben aangepast. Als de automatische merge faalt, zal Git je vragen de issues handmatig op te lossen. Je kunt ook tools van derden gebruiken om te helpen bij het visualiseren en integreren van de wijzigingen.
Commando’s om Git-mergeconflicten op te lossen
In deze sectie bekijken we verschillende native commando’s om Git-mergeconflicten te visualiseren en op te lossen.
Algemene commando’s
Git status is het meest gebruikte commando om de status van gewijzigde bestanden, de staging area en commits te tonen. Tijdens het mergeproces gebruik je het om conflicterende bestanden te identificeren.
git status
De Git log met --merge-argumenten geeft de lijst met commits die in conflict zijn met de sourcebranch.
git log --merge
Standaard laat de optie git diff het verschil zien tussen niet-gecommitte wijzigingen en eerdere commits. Git diff wordt gebruikt om branches, commits en bestanden te vergelijken. Het is handig om toekomstige mergeconflicten te voorkomen.
git diff
Commando’s wanneer de merge aan het begin faalt
Checkout wordt gebruikt om wijzigingen ongedaan te maken of om naar een nieuwe of oude branch te schakelen.
git checkout
Git reset is bedoeld om wijzigingen in de working directory en de staging area terug te draaien.
git reset --mixed
Commando’s voor conflicten tijdens de merge
Het argument --abort stopt het mergeproces en zet de wijzigingen terug naar de oorspronkelijke staat van voor de merge.
git merge --abort
Git reset wordt tijdens het mergeproces vaak gebruikt om conflicterende bestanden terug te zetten naar hun oorspronkelijke staat.
git reset
Conflicten met verwijderde/gewijzigde bestanden oplossen
Een Git-conflict ontstaat als je het bestand in de huidige branch hebt verwijderd en iemand anders het in een andere branch heeft gewijzigd. Je kunt in dat geval óf een bestand toevoegen en committen,
git add <filename>
óf je kunt het bestand verwijderen en committen.
git rm <filename>
📌 Spiekbriefje voor het oplossen van Git-mergeconflicten
| Commando | Beschrijving | Voorbeeldgebruik |
|---|---|---|
git status |
Toont bestanden met mergeconflicten | git status |
git diff |
Toont verschillen tussen commits of branches | git diff HEAD |
git log --merge |
Toont commits die bij een conflict betrokken zijn | git log --merge |
git merge --abort |
Annuleert een merge en herstelt de vorige staat | git merge --abort |
git reset --hard HEAD |
Zet de branch terug naar de laatst gecommit-te staat | git reset --hard HEAD |
git checkout -- <filename> |
Verwerpt wijzigingen in een specifiek bestand | git checkout -- README.md |
git mergetool |
Opent de geconfigureerde mergetool voor conflictoplossing | git mergetool |
git add <filename> |
Markeert een conflict als opgelost na het bewerken | git add README.md |
git commit -m "<message>" |
Slaat opgeloste wijzigingen op na een mergeconflict | git commit -m "Resolved merge conflict" |
git rebase --continue |
Gaat verder met een onderbroken rebase na het oplossen van conflicten | git rebase --continue |
git rm <filename> |
Verwijdert een bestand dat in de ene branch is verwijderd en in de andere is gewijzigd | git rm README.md |
git push |
Push-t wijzigingen na het oplossen van mergeconflicten | git push origin main |
Visuele mergetools
Mergetools zijn gebruiksvriendelijke visuele tools om alle soorten mergeconflicten te identificeren en op te lossen. Sommige tools ondersteunen extra mogelijkheden zoals het vergelijken van wijzigingen, Git-operaties en project- en repositorybeheer. Er zijn twee typen Git-mergetools: alleen terminal en GUI-gebaseerd. De terminaltools openen in PowerShell of Bash, en de GUI-tools openen in een vensteromgeving.
Gebruik dit om de lijst met geïnstalleerde en geldige tools te bekijken:
git mergetool --tool-help
De lijst bevat alle geldige tools die kunnen worden geïnstalleerd en geïntegreerd met git-commando’s.
We hebben bijvoorbeeld vim en nvim standaard geïnstalleerd, en als je het verschil wilt zien tussen een niet-gecommit bestand en een vorige commit, typ je:
git difftool --tool=vimdiff3
De tool vimdiff3 markeert de wijzigingen en laat je binnen de terminal commits vergelijken.

Verschil tussen twee versies van hetzelfde bestand in vimdiff3
Meld
Meld is een gratis en open-sourcetool die het oplossen van mergeconflicten naar een hoger niveau tilt. Om het met Git te integreren, moet je het eerst downloaden en installeren vanaf de officiële site. Voeg het daarna toe aan de globale configuratie zodat Git standaard Meld start om conflicten op te lossen.
De onderstaande configuratiecommando’s zijn alleen van toepassing op Windows-gebruikers. De enige aanpassing die je moet doen, is het pad naar het Meld-installatiebestand wijzigen voor Mac of Linux.
git config --global merge.tool meld
git config --global mergetool.meld.path "C:/Program Files (x86)/Meld/Meld.exe"
git config --global diff.tool meld
git config --global difftool.meld.path "C:/Program Files (x86)/Meld/Meld.exe"
Na het instellen van defaults kun je git difftool typen binnen de lokale Git-directory om de Windows-versie van Meld te starten, of git mergetool om mergeconflicten op te lossen zoals hieronder getoond.

Een mergeconflict oplossen met Meld
VSCode
VSCode biedt de beste en meest populaire manier om mergeconflicten op te lossen. Wanneer Git bestanden niet automatisch kan mergen, markeert VSCode de conflicterende code en geeft je vier opties: huidige wijzigingen accepteren, inkomende wijzigingen accepteren, beide wijzigingen accepteren en wijzigingen vergelijken. Met deze opties kun je je bestand opschonen en alle openstaande issues oplossen.

Een mergeconflict oplossen met VSCode
Zoek je een complete oplossing voor je Git-operaties, probeer dan GitKraken. Het wordt geleverd met een gratis client, een VSCode-extensie en biedt een ingebouwde tool voor het oplossen van mergeconflicten.
Zo los je een Git-mergeconflict op
In deze sectie leren we hoe je een Git-mergeconflict creëert en het vervolgens oplost. De tutorial is opgedeeld in twee delen. In het eerste deel leren we Git-conflicten lokaal op te lossen; het tweede deel gaat over het oplossen van conflicten met een remote server (GitHub).
Lokaal mergeconflict
Mergeconflicten creëren helpt ons te begrijpen hoe deze issues überhaupt ontstaan. Vervolgens kunnen we slimme manieren gebruiken om ze op te lossen of zelfs in de toekomst te voorkomen.
We maken nu een Git-repository met één bestand en maken onze eerste commit om te beginnen.
- Maak een map met de naam datacamp.
- Navigeer naar de map datacamp.
- Initialiseer Git.
- Maak een
README.md-bestand met de gegeven titel. - Stage en commit de wijzigingen in een bestand.
mkdir datacamp
cd datacamp
git init
echo "# How to Resolve Git Merge Conflict" > README.md
git add README.md
git commit -m "first commit"
>>> [main (root-commit) 8199ea2] first commit
>>> 1 file changed, 1 insertion(+)
>>> create mode 100644 README.md
Vervolgens maken we een nieuwe branch readme en veranderen we de titel van “..Git Merge..” naar “..Git..”. Voeg het bestand toe en maak de commit met het argument -am.
git checkout -b readme
echo "# How to Resolve Git Conflict" > README.md
git commit -am "new branch conflict added"
>>> [readme 155f694] new branch conflict added
>>> 1 file changed, 1 insertion(+), 1 deletion(-)
Ga terug naar de main-branch en voeg een nieuwe regel toe aan het README.md-bestand met >>. Door de wijzigingen op te slaan en te committen, hebben we met succes een conflict gecreëerd tussen twee versies van hetzelfde bestand.
git checkout main
echo "New change in base branch" >> README.md
git commit -am " a line added to base branch Readme file"
>>> [main f1f1874] a line added to base branch Readme file
>>> 1 file changed, 1 insertion(+)
Zoals we zien, geeft Git tijdens het mergen van de readme-branch een melding dat de automatische merge is mislukt en dat we handmatig wijzigingen moeten aanbrengen en vervolgens het resultaat moeten committen.
git merge readme
>>> Auto-merging README.md
>>> CONFLICT (content): Merge conflict in README.md
>>> Automatic merge failed; fix conflicts and then commit the result.
We lossen het probleem handmatig op door het bestand te openen en te bewerken in Kladblok. De afbeelding hieronder toont de pijl met HEAD, een scheiding, en een pijl de andere kant op met readme. Het HEAD-gedeelte toont de bestaande wijzigingen in de main-branch, en readme is de branch die we willen mergen, met een andere kop.
Een mergeconflict handmatig oplossen
Om het probleem op te lossen verwijderen we het deel van de readme-branch, de pijlen en de scheiding. De uiteindelijke versie van het bestand moet er schoon uitzien, zoals hieronder.

Conflict opgelost
Nadat we het bestand hebben toegevoegd en een commit hebben gemaakt, is het mergeconflict opgelost. Dit is de meest gebruikelijke en eenvoudigste manier om issues op te lossen. Je kunt ook een IDE gebruiken om issues sneller op te lossen.
git commit -am "conflict resolved in file README.md"
>>> [main 9994a29] conflict resolved in file README.md
Remote mergeconflict
Voor het creëren en oplossen van remote mergeconflicten moeten we een nieuwe repository op GitHub maken.

Een nieuwe repository maken op GitHub
Voeg vervolgens de remote-naam (origin) met adres toe aan de repository en push alle wijzigingen van een lokale repository naar de remote main-branch met upstream.
git remote add origin https://github.com/kingabzpro/DataCamp-Git-Merge-Guide.git
git push --set-upstream origin main
>>> Enumerating objects: 12, done.
>>> Counting objects: 100% (12/12), done.
>>> Delta compression using up to 4 threads
>>> Compressing objects: 100% (6/6), done.
>>> Writing objects: 100% (12/12), 998 bytes | 499.00 KiB/s, done.
>>> Total 12 (delta 2), reused 0 (delta 0), pack-reused 0
>>> remote: Resolving deltas: 100% (2/2), done.
>>> To https://github.com/kingabzpro/DataCamp-Git-Merge-Guide.git
>>> * [new branch] main -> main
>>> branch 'main' set up to track 'origin/main'.
Om een conflict te creëren, moeten we wijzigingen aanbrengen in het remote en lokale README.md-bestand. Je kunt de GitHub-bestandseditor gebruiken om “..Git merge..” te veranderen in “..Sit-Merge..” en vervolgens de wijzigingen te committen.

Wijzigingen aanbrengen in de GitHub-editor
Wijzig daarna in de lokale repository het README.md-bestand om alleen een eenvoudige titel toe te voegen en commit de wijzigingen.
echo "# How to Resolve Merge Conflicts in Git Tutorial" > README.md
git commit -am "local branch changes in README.md"
>>> [main c677a13] local branch changes in README.md
>>> 1 file changed, 1 insertion(+), 4 deletions(-)
Push tenslotte de wijzigingen naar de remote server. Let op dat Git een foutmelding geeft met hints hoe je het probleem kunt oplossen.
git push
>>> To https://github.com/kingabzpro/DataCamp-Git-Merge-Guide.git
>>> ! [rejected] main -> main (fetch first)
>>> error: failed to push some refs to 'https://github.com/kingabzpro/DataCamp-Git-Merge-Guide.git'
>>> hint: Updates were rejected because the remote contains work that you do
>>> hint: not have locally. This is usually caused by another repository pushing
>>> hint: to the same ref. You may want to first integrate the remote changes
>>> hint: (e.g., 'git pull ...') before pushing again.
>>> hint: See the 'Note about fast-forwards' in 'git push --help' for details.
We volgen de eenvoudigste hint: eerst het bestand van de remote server pullen voordat we pushen.
Pullen van het bestand mislukte door een mergeconflict in het README.md-bestand. We zouden het handmatig kunnen fixen met Kladblok, maar dit keer gebruiken we een visuele tool om ons te helpen in dit proces.
git pull
>>> remote: Enumerating objects: 5, done.
>>> remote: Counting objects: 100% (5/5), done.
>>> remote: Compressing objects: 100% (2/2), done.
>>> remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
>>> Unpacking objects: 100% (3/3), 681 bytes | 75.00 KiB/s, done.
>>> From https://github.com/kingabzpro/DataCamp-Git-Merge-Guide
>>> aaf149d..49b7d14 main -> origin/main
>>> Auto-merging README.md
>>> CONFLICT (content): Merge conflict in README.md
>>> Automatic merge failed; fix conflicts and then commit the result.
Mergetool Meld identificeert conflicterende bestanden en toont ze in de Meld-GUI-applicatie.
git mergetool
>>> Merging:
>>> README.md
>>> Normal merge conflict for 'README.md':
>>> {local}: modified file
>>> {remote}: modified file
Er zijn drie kolommen: README_LOCAL_473.md, README.md en README_LOCAL_473.md. Als je denkt dat de remote-wijzigingen kloppen, klik dan op de zwarte pijl in de remote-kolom; en als je de lokale wijzigingen wilt behouden, klik dan op de zwarte pijl in de lokale kolom. Zo simpel is het.

Conflict opgelost met mergetool Meld
Nadat je wijzigingen hebt doorgevoerd, sla je het bestand op en commit je. Zoals je ziet, veroorzaakt het pushen naar een remote server nu geen mergeconflict.
git commit -am "remote main branch conflict resolved"
git push
>>> Enumerating objects: 16, done.
>>> Counting objects: 100% (16/16), done.
>>> Delta compression using up to 4 threads
>>> Compressing objects: 100% (6/6), done.
>>> Writing objects: 100% (10/10), 1.08 KiB | 550.00 KiB/s, done.
>>> Total 10 (delta 2), reused 0 (delta 0), pack-reused 0
>>> remote: Resolving deltas: 100% (2/2), completed with 1 local object.
>>> To https://github.com/kingabzpro/DataCamp-Git-Merge-Guide.git
>>> 49b7d14..8f5c3aa main -> main
We hebben zowel lokale als remote mergeconflicten succesvol opgelost. Met deze conflicten krijgen data scientists en machine learning engineers dagelijks te maken. Wil je je Git-skills verbeteren, volg dan de cursus Introduction to Git.
Conclusie
Het oplossen van Git-mergeconflicten is complex en risicovol, omdat je software kunt breken door defecte code te mergen. Mergetools bieden een gebruiksvriendelijke omgeving en een veiligere manier om mergeconflicten te detecteren en op te lossen. In deze tutorial hebben we geleerd waarom Git-conflicten ontstaan en hoe je ze oplost. We hebben ook verschillende merge- en conflictsoorten, nuttige Git-commando’s en visuele tools behandeld. In het laatste deel hebben we een mergeconflict gecreëerd en het opgelost in een lokale en remote repository.
Ben je nieuw met Git en wil je leren hoe het werkt? Lees dan: Intro to Git and GitHub Tutorial.
Als gecertificeerd data scientist haal ik met passie het maximale uit de nieuwste technologie om innovatieve machinelearning-toepassingen te bouwen. Met een sterke achtergrond in spraakherkenning, data-analyse en -rapportage, MLOps, conversationele AI en NLP heb ik mijn vaardigheden aangescherpt in het ontwikkelen van intelligente systemen die echt impact maken. Naast mijn technische expertise ben ik ook een sterke communicator met een talent om complexe concepten terug te brengen tot heldere, beknopte taal. Daardoor ben ik uitgegroeid tot een veelgelezen blogger over data science, waar ik mijn inzichten en ervaringen deel met een groeiende community van data-professionals. Op dit moment richt ik me op contentcreatie en redactie, waarbij ik met large language models werk aan krachtige en aansprekende content die zowel bedrijven als individuen helpt het beste uit hun data te halen.
FAQs
Wat zijn best practices om Git-mergeconflicten te voorkomen?
Om het risico op conflicten te verkleinen:
- Altijd de laatste wijzigingen pullen (
git pull origin main) voordat je nieuw werk start. - Communiceer met je team om te voorkomen dat je aan dezelfde codelijnen werkt.
- Maak kleine, frequente commits in plaats van grote, complexe.
- Gebruik featurebranches in plaats van direct te committen op
main. - Draai
git diffvóór het mergen om potentiële conflicten vroeg te spotten.
Kan ik mergeconflicten oplossen zonder terminal?
Ja! Veel GUI-gebaseerde Git-tools maken conflictoplossing eenvoudiger:
- VS Code: Markeert conflicten met opties als "Accept Incoming" en "Accept Current".
- GitKraken: Biedt een visuele interface om interactief conflicten op te lossen.
- Meld / Beyond Compare: Mergetools die helpen verschillen visueel te vergelijken en op te lossen. Voer
git mergetooluit om een geconfigureerde visuele tool te gebruiken.
Waarom krijg ik steeds mergeconflicten, zelfs nadat ik ze heb opgelost?
Mogelijke oorzaken zijn:
- Je bent vergeten de opgeloste bestanden te stagen (
git add) en te committen (git commit -m "Resolved conflict"). - Een teammate heeft nieuwe conflicterende wijzigingen gepusht nadat jij de jouwe had opgelost. Probeer
git pull --rebase. - Je hebt je opgeloste wijzigingen niet gepusht voordat je opnieuw merge-de. Voer altijd
git pushuit na het oplossen van conflicten.
Wat moet ik doen als ik per ongeluk een merge abort (git merge --abort)?
Als je een merge hebt geaborteerd maar wilt opnieuw proberen, kun je:
- Het merge-commando opnieuw draaien (
git merge <branch-name>). - Gebruik
git reflogom de vorige staat voor de abort te bekijken en zo nodig te herstellen.
Hoe maak ik een fout ongedaan bij het oplossen van een mergeconflict?
Als je een fout hebt gemaakt bij het oplossen van een conflict:
- Voer
git reset --hard HEADuit om alle wijzigingen te verwerpen en opnieuw te beginnen. - Gebruik
git checkout -- <filename>om specifieke bestanden naar hun originele staat terug te zetten. - Als je de fout al hebt gecommit, gebruik dan
git revert <commit-hash>om een nieuwe commit te maken die de wijzigingen ongedaan maakt.
Hoe los ik een mergeconflict in binaire bestanden op?
Git kan binaire bestanden niet automatisch mergen (bijv. afbeeldingen, pdf’s). Om op te lossen:
- Kies handmatig welke versie je behoudt en vervang het bestand.
- Gebruik
git checkout --theirs <filename>ofgit checkout --ours <filename>om één versie te behouden. - Commit het opgeloste bestand (
git add <filename> && git commit -m "Resolved binary file conflict").
Wat is het verschil tussen git merge --abort en git reset --merge?
git merge --abort: Maakt een merge veilig ongedaan en herstelt de branch naar de vorige staat van voor de merge.git reset --merge: Vergelijkbaar, maar behoudt gestage-de bestanden en kan nuttiger zijn als je bepaalde wijzigingen wilt bewaren.
Hoe los ik een mergeconflict op bij het pushen naar GitHub?
Als git push faalt met een mergeconflictfout, probeer dan het volgende:
- Pull de laatste wijzigingen:
git pull origin main --rebase - Los conflicten handmatig op in je lokale branch.
- Stage en commit de opgeloste bestanden:
git add <conflicted-file>
git commit -m "Resolved merge conflict"
- Push opnieuw:
git push origin main
Wat is een rebaseconflict en hoe los ik het op?
Een rebaseconflict ontstaat bij git rebase <branch> wanneer wijzigingen niet netjes toegepast kunnen worden. Oplossen:
- Los conflicten handmatig op en voer dan
git rebase --continueuit. - Als je de rebase wilt annuleren, gebruik
git rebase --abort. - Gebruik
git rebase --skipals je de conflicterende commit wilt overslaan.
Kan ik branches zonder conflicten mergen met Git-instellingen?
Git heeft een automatische mergestrategie die soms helpt:
- Gebruik
git merge -X theirs <branch>om altijd de wijzigingen van de andere branch te accepteren. - Gebruik
git merge -X ours <branch>om altijd de wijzigingen van je eigen branch te behouden. Dit is echter niet waterdicht en moet voorzichtig worden gebruikt.

