Een doorloop van de tutorial Merge-conflicten oplossen: waarom het mergen van Alice's wijziging botst met die van jou, hoe je de conflictmarkers leest en hoe je de merge afrondt.
Dit scenario zet je in een veel voorkomende teamsituatie: jij en een teamgenoot hebben dezelfde regel veranderd en Git heeft je hulp nodig om beide te combineren. Je haalt het werk van je teamgenoot binnen, mergt het in je branch, lost de botsing met de hand op en rondt de merge af.
De situatie
Je staat op de branch feature/update-subtitle, waar je de hero-subtitel in index.html hebt herschreven. Ondertussen heeft je collega Alice haar eigen bewerking van diezelfde subtitelregel naar main gepusht.
Twee verschillende bewerkingen van dezelfde regel, op twee branches. Git kan wijzigingen op verschillende plekken fast-forwarden of automatisch mergen, maar als beide kanten dezelfde regel wijzigen kan het niet raden welke wint. Dat is een merge-conflict, en alleen jij kunt de uitkomst bepalen.
Een conflict is geen fout van jouw kant. Het is Git die pauzeert zodat een mens kan kiezen, omdat beide bewerkingen op zichzelf geldig zijn.
Stap voor stap doorlopen
main bijwerken
git checkout main
git pull
Naar main wisselen en pullen haalt Alice's subtitelwijziging van de remote, zodat jouw lokale main haar werk heeft.
main mergen in je feature-branch
git checkout feature/update-subtitle
git merge main
Git probeert Alice's subtitelregel met die van jou te combineren, mislukt op die regel en meldt een conflict in index.html. De merge pauzeert hier.
Het bestand openen en de markers lezen
Het conflictgebied ziet er zo uit:
<<<<<<< HEAD
jouw versie van de subtitel
=======
Alice's versie van de subtitel
>>>>>>> main
HEAD is jouw branch; het deel na ======= is de inkomende wijziging vanuit main.
Oplossen en de merge afronden
git add index.html
git commit
Bewerk index.html zodat alleen de ene uiteindelijke subtitel die je wilt erin staat en verwijder de regels <<<<<<<, ======= en >>>>>>>. Het bestand stagen vertelt Git dat het conflict is afgehandeld en de commit legt de merge vast.
Conflictmarkers lezen
De drie markers verschijnen altijd in dezelfde volgorde:
<<<<<<< HEAD tot ======= is jouw kant.
======= tot >>>>>>> is de inkomende kant.
- Oplossen betekent: laat de gewenste inhoud staan en verwijder alle drie de markerregels.
git status tijdens een conflict toont de nog op te lossen bestanden onder "Unmerged paths". Is die lijst leeg, dan kun je committen.
Laat geen enkele markerregel in het bestand staan. Een vergeten ======= wordt als echte inhoud gecommit en breekt de pagina. Zoek in het bestand naar de markers voor je het staget.
Wil je opnieuw beginnen?
Loopt een oplossing uit de hand, dan kun je de hele merge afbreken en terug naar de toestand ervoor:
git merge --abort