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.