0%

Samenvoegen en conflicten

Wanneer een merge een commit nodig heeft

Een fast-forward werkt als één branch alleen verder is op hetzelfde pad. Soms zijn beide branches na de splitsing opgeschoven. Dan zijn er twee werklijnen om te behouden.

Twee lijnen hebben een verbinding nodig

Stel dat beide branches bij commit B begonnen. Daarna maakte main commit C en maakte simplify-tiers commit D:

          C  main
         /
A -> B
         \
          D  simplify-tiers

Als je main direct naar D verplaatst, valt C uit zijn lijn. Als je hem niet verplaatst, ontbreekt D. Daarom maakt Git een nieuwe commit die beide geschiedenissen verbindt:

          C ----\
         /       M  main
A -> B          /
         \     /
          D ---   simplify-tiers

De nieuwe commit M is een mergecommit. Een gewone commit heeft één oudercommit: de commit direct ervoor. Een echte mergecommit heeft er twee: het vorige uiteinde van de huidige branch en het uiteinde van de binnengehaalde branch.

De volgorde geeft de richting aan. Als main de huidige branch is, vormt zijn vorige uiteinde de eerste oudercommit. Het uiteinde van simplify-tiers is de tweede. Beide blijven in de bereikbare geschiedenis, dus de merge gooit geen van beide werklijnen weg.

Een mergecommit is nog steeds een momentopname

De mergecommit legt één volledige projectmomentopname vast, net als elke andere commit. Het verschil zit niet in een bijzondere manier van bestanden opslaan. Het zit in de twee ouderverwijzingen die zeggen: “deze twee lijnen komen hier samen”.

Als de branches verschillende bestanden of verschillende delen van één bestand veranderden, kan Git die momentopname meestal zonder hulp maken. Het combineert de wijzigingen en maakt de mergecommit.

Als beide branches dezelfde regels anders veranderden, weet Git niet welke uiteindelijke tekst je bedoelt. Het stopt vóór de commit en vraagt jou te beslissen. Die onderbreking heet een mergeconflict. De commit met twee oudercommits is nog niet gemaakt, maar beide oudercommits en al het werk blijven beschikbaar.

Wat onderscheidt een echte mergecommit van een gewone commit?

Beide branches veranderden dezelfde regels op verschillende manieren. Wat doet Git als het het bedoelde resultaat niet kan kiezen?

De voorbereide repository staat precies op dat punt stil. Hierna lees je de toestand, bekijk je hoe Git de alternatieven markeert en leer je de veilige weg terug als je nog niet kunt beslissen.