0%

Samenvoegen en conflicten · oefening

Los een mergeconflict op

Je hebt een repository midden in een mergeconflict geopend. main voegde een Solo-pakket en chatondersteuning toe. Tegelijk verhoogde simplify-tiers de prijzen van Standard en Team. Beide wijzigingen zijn nuttig en pricing.md bevat de twee gemarkeerde alternatieven. Je taak is er één bewust gekozen resultaat van te maken en de merge af te ronden.

Deze les werkt vanaf de ongewijzigde beginsituatie van het hoofdstuk. Je kunt hier dus direct binnenkomen zonder de eerdere lessen af te ronden. Heb je die wel gevolgd, dan bevat je main ook de twee merges uit les 4. Dat verandert niets aan wat hieronder volgt.

Controleer de gepauzeerde merge

Begin met de gewone opdracht die de huidige toestand van de repository beschrijft:

git status

Er zijn hier twee mogelijke antwoorden en beide zijn goed.

Als de uitvoer unmerged paden meldt en pricing.md noemt, staat de merge al stil. Je kunt dan meteen naar het volgende onderdeel. Dat zie je als je rechtstreeks bij deze les binnenkomt.

Als de uitvoer een schone werkboom meldt, is de merge nog niet bezig. Daar eindigen de eerdere lessen van dit hoofdstuk. Start hem nu:

git merge simplify-tiers
git status

git merge haalt de genoemde branch binnen in de branch waarop je staat: main. Git stopt bij pricing.md en meldt het als unmerged pad, precies zoals les 3 beschreef.

Bepaal wat het uiteindelijke bestand moet bevatten

De bedrijfskeuze is concreet: behoud het Solo-pakket en de chatondersteuning van main en gebruik de verhoogde prijzen van Standard en Team uit simplify-tiers. Het opgeloste bestand moet er zo uitzien:

# Pricing

Solo: 12 per month
Standard: 25 per month
Team: 75 per month
Support: email, and chat on Team

Dat resultaat komt met geen van beide oudercommits overeen. Het combineert bewust een deel van elk. Dat was het werk waarvoor Git een mens nodig had.

Open het bestand in nano:

nano -w pricing.md

-w voorkomt dat nano harde regeleinden invoegt in een smalle terminal. Bewerk het bestand tot het bovenstaande resultaat erin staat. Verwijder alle drie de markeringsregels en de ongewenste alternatieve regels. Sla op met Ctrl-O, druk op Enter om pricing.md te bevestigen en sluit af met Ctrl-X.

Markeer het conflict als opgelost

Opslaan verandert de bytes van het bestand, maar Git behandelt het pad nog als unmerged totdat je de oplossing klaarzet. git add pricing.md zet het opgeloste bestand in de staging area en vertelt Git dat dit conflict is beslist.

git add pricing.md
git status

De tweede opdracht hoort geen unmerged paden meer te tonen. In plaats daarvan zegt ze dat alle conflicten zijn opgelost, maar dat de merge nog bezig is. Bekijk die toestand goed: klaarzetten rondt de bestandskeuze af, niet de merge zelf.

Rond de mergecommit af

git commit rondt de gepauzeerde merge af door de commit met twee oudercommits te maken. De optie -m geeft het bericht tussen aanhalingstekens direct mee, zodat er geen editor opent.

git commit -m "Merge simplified pricing tiers"
git status

De laatste git status hoort een schone werkboom te melden en geen lopende merge. De eerste oudercommit van de nieuwe commit is het oude uiteinde van main; de tweede is het uiteinde van simplify-tiers. Het losstaande index.html bleef precies zoals het was.

Wil je de oefening na het afronden van de merge herhalen, doe dit dan alleen in de oefenrepository:

git reset --hard HEAD~1
git merge simplify-tiers

De harde reset haalt de mergecommit weg en herstelt bijgehouden bestanden naar de eerste oudercommit. Beide branches blijven bestaan, dus de tweede opdracht maakt hetzelfde conflict opnieuw. Dit gooit ook later niet-gecommit werk weg. Daarom hoort het alleen in deze wegwerp-oefenrepository thuis.

Je hebt elke conflictmarkering verwijderd en pricing.md opgeslagen. Waarom voer je toch nog git add pricing.md uit?

Een conflict is nu een procedure die je kunt herhalen: lees git status, bekijk de gemarkeerde alternatieven, bewerk ze tot één bedoeld resultaat, zet elk opgelost pad klaar, commit de merge en controleer of de werkboom schoon is. Kun je nog niet beslissen, breek dan af en ga terug naar de toestand van vóór de merge. Geen stap in die reeks vraagt om paniek of weggegooid werk.