Hoofdstuk 6
Samenvoegen en conflicten
Breng twee branches samen
Twee branches kunnen nuttig werk bevatten dat bij elkaar hoort. De een heeft bijvoorbeeld prijzen verbeterd, terwijl de ander een nieuw prijspakket toevoegde. Als je beide branches eeuwig apart houdt, blijft het project verdeeld. Een merge voegt hun werk samen in één geschiedenis.
Voeg samen in de branch waarop je staat
Git voegt altijd samen in de huidige branch. Die richting doet ertoe. Als main de huidige branch is en je simplify-tiers erbij wilt halen, ziet de gewone opdracht er zo uit:
git merge simplify-tiers
git merge vraagt Git om een andere branch te combineren met de branch waarop je staat. simplify-tiers is de branch die je erbij haalt. De opdracht schakelt niet naar die branch over, verwijdert hem niet en maakt geen contact met een andere repository.
Controleer bij je eigen werk vóór een merge met git branch het sterretje naast de huidige branch. Controleer met git status of je werkboom op orde is. De voorbereide repository van dit hoofdstuk zit al midden in een merge. Laat de toestand in de terminal daarom tot les 3 met rust. Voor nu gaat het erom te begrijpen wat Git probeert te doen.
De eenvoudigste vorm is een fast-forward
Stel dat main niet is veranderd sinds simplify-tiers begon. De andere branch is dan alleen verder op hetzelfde pad:
main ------------> B
\
simplify-tiers -----> C -> D
Er is geen afzonderlijk werk om op elkaar af te stemmen. Git kan de naam main van B naar D verplaatsen. Dit heet een fast-forward merge.
main ---------------------> D
simplify-tiers -----------> D
Er is geen nieuwe commit nodig. De bestaande commits vertellen het hele verhaal al en beide branchnamen wijzen nu naar dezelfde nieuwste commit.
Dat kan verrassend zijn, omdat de opdracht merge heet terwijl Git alleen een branchwijzer verplaatste. Toch combineert het resultaat het werk: de huidige branch bereikt nu de commits uit de andere branch.
Je staat op main en voert git merge simplify-tiers uit. Welke branch krijgt het gecombineerde resultaat?
Wanneer kan Git een merge met een fast-forward afronden?
De volgende les behandelt de andere vorm: beide branches zijn verplaatst, dus de gecombineerde geschiedenis heeft een commit met twee oudercommits nodig.