0%

Samenvoegen en conflicten · oefening

Voeg een branch samen zonder conflict

Door een onvoltooid conflict kan elke merge voelen als een ruzie die op uitbreken staat. De meeste merges verlopen rustiger: Git schuift een branch vooruit of combineert wijzigingen die elkaar niet in de weg zitten.

Voordat je het voorbereide conflict oplost, maak je daarom zelf twee merges die zonder problemen verlopen. Beide gebruiken alleen opdrachten die je al kent.

Je repository hoort op main te staan met een schone werkboom. Als git status een lopende merge meldt, beëindig die dan vóór je begint met git merge --abort uit de vorige les.

git status

Een branch die alleen verder is

Maak een branch, zet er één commit op en laat main op zijn plek:

git switch -c opening-note
nano -w hours.txt

Typ deze ene regel, sla op met Ctrl-O, Enter en sluit af met Ctrl-X:

Open 9:00 to 17:00, Tuesday to Saturday.

Commit het bestand en ga terug naar main:

git add hours.txt
git commit -m "Add the opening hours"
git switch main

main is niet verplaatst sinds opening-note begon. opening-note is dus alleen verder op dezelfde lijn. Dat is de fast-forwardvorm uit les 1. Voeg de branch samen:

git merge opening-note
git log

Lees wat Git toont. Er staat Fast-forward en git log heeft één commit meer dan ervoor, niet twee. Er is geen mergecommit gemaakt, want die was niet nodig: Git schoof de naam main vooruit langs commits die al bestonden.

Twee branches die allebei opschoven

Maak nu bewust de andere vorm. Begin een tweede branch en commit daarop:

git switch -c contact-note
nano -w contact.txt

Voer deze regel in en sla op en sluit af zoals hiervoor:

Questions: hello@example.invalid
git add contact.txt
git commit -m "Add a contact line"
git switch main

Commit deze keer ook iets op main, zodat geen van beide branches het werk van de andere bevat:

nano -w notice.txt

Voer deze regel in, sla op en sluit af:

The shop is closed on public holidays.
git add notice.txt
git commit -m "Note the holiday closure"
git merge contact-note -m "Merge the contact line"
git log

Git kon deze keer niet alleen een wijzer verplaatsen. main had namelijk een commit die in contact-note ontbrak, en andersom. Het maakte daarom de commit met twee oudercommits uit les 2. De optie -m geeft het bericht voor die mergecommit mee, net als bij een gewone commit.

De twee branches veranderden verschillende bestanden, dus Git combineerde ze zonder je iets te vragen. Dat is de gewone situatie. Merk op hoe weinig bijzonders eraan te pas kwam.

Waarom deze twee merges rustig verliepen

Terwijl je dit deed veranderde er niets aan het voorbereide conflict. simplify-tiers en main verschillen nog steeds over dezelfde drie regels van pricing.md. Een merge daarvan zal nog steeds stoppen.

Het verschil zit niet in geluk of in de grootte van de wijziging. Een veelvoorkomend tekstconflict ontstaat als beide kanten dezelfde regels veranderen, zodat niet duidelijk is welke combinatie je bedoelt. Git kan ook stoppen bij andere onverenigbare wijzigingen, bijvoorbeeld als de ene kant een pad verwijdert dat de andere bewerkte. Verschillende bestanden worden zonder problemen samengevoegd; verschillende delen van één bestand meestal ook.

Je twee branches voegden contact.txt en notice.txt toe. Git voegde ze samen zonder je iets te vragen. Waarom?

Na git merge opening-note meldde Git Fast-forward en kreeg de geschiedenis één extra commit in plaats van twee. Wat vertelt dat?

Je hebt nu twee merges afgerond en de vormen in je eigen geschiedenis gelezen. Dat is de normale ervaring bij samenvoegen. De volgende les keert terug naar het voorbereide meningsverschil: de andere, minder voorkomende ervaring waarvoor dit hoofdstuk er is.