Close

Opties en voorbeelden van de Git merge-strategie

Wanneer het werk voltooid, getest en klaar is om weer te worden samengevoegd in de hoofdlijn van het ontwikkelingsproces, moet je team een aantal beleidskeuzes maken. Wat zijn je opties voor een merge-strategie? In dit artikel bekijken we de mogelijkheden en maken we vervolgens enkele opmerkingen over hoe Atlassian werkt. Hopelijk heb je uiteindelijk de middelen om te beslissen wat het beste werkt voor jouw team.


Git Merge-strategieën


Een merge vindt plaats wanneer twee branches worden samengevoegd. Git heeft twee (of meer) commit-pointers nodig en zal proberen een gemeenschappelijke basis-commit tussen beide te vinden. Git heeft verschillende methoden om een basis-commit te vinden. Deze methoden worden 'merge-strategieën' genoemd. Zodra Git een gemeenschappelijke basis-commit heeft gevonden, wordt er een nieuwe 'merge commit' aangemaakt, die de wijzigingen van de merge commits combineert. Technisch gezien is een merge commit een gewone commit die twee bovenliggende commits heeft.

Merge git

git merge selecteert automatisch een merge-strategie, tenzij expliciet anders aangegeven. Aan de opdrachten git merge en git pull kan de optie -s (strategie) worden doorgegeven. De optie -s kan worden toegevoegd met de naam van de gewenste merge-strategie. Indien niet expliciet gespecificeerd, selecteert Git de meest geschikte merge-strategie op basis van de aangeboden branches. Hieronder volgt een lijst met de beschikbare merge-strategieën.

Consolevenster
gerelateerd materiaal

Uitgebreid Git log

Logo Bitbucket
Oplossing bekijken

Git leren met Bitbucket Cloud

Recursive

git merge -s recursive branch1 branch2

Dit werkt op twee heads. Recursive is de standaard merge-strategie voor het pullen of samenvoegen van één branch. Bovendien kunnen hiermee merges met gewijzigde namen worden gedetecteerd en verwerkt, maar op dit moment kan er geen gebruik worden gemaakt van gedetecteerde kopieën. Dit is de standaard merge-strategie voor het pullen of samenvoegen van één branch.

Oplossen

git merge -s resolve branch1 branch2

Hiermee kunnen alleen twee heads worden opgelost met een merge-algoritme voor drie richtingen. De strategie probeert dubbelzinnigheden van gekruiste merges zorgvuldig te detecteren en wordt over het algemeen beschouwd als veilig en snel.

Octopus

git merge -s octopus branch1 branch2 branch3 branchN

De standaard merge-strategie voor meer dan twee heads. Wanneer meer dan één branch wordt doorgegeven, wordt octopus automatisch ingeschakeld. Als een merge conflicten bevat die handmatig moeten worden opgelost, weigert octopus de samenvoeging uit te voeren. Deze strategie wordt voornamelijk gebruikt om heads van vergelijkbare functiebranches te koppelen.

Ours

git merge -s ours branch1 branch2 branchN

De Ours-strategie werkt op een veelvoud van N branches. Het uitgevoerde merge-resultaat is altijd dat van de huidige branch HEAD. De term 'ours' (onze) impliceert dat er een voorkeur is om alle wijzigingen uit alle andere branches effectief te negeren. De strategie is bedoeld om de geschiedenis van vergelijkbare functiebranches te combineren.

Subtree

git merge -s subtree branchA branchB

Dit is een uitbreiding van de Recursive-strategie. Als A en B worden samengevoegd en B een onderliggende subtree is van A, wordt B eerst bijgewerkt om de boomstructuur van A weer te geven. Deze update wordt ook uitgevoerd voor de gemeenschappelijke voorouderboom die A en B delen.

Soorten Git merge-strategieën


Explicit merge

Expliciete samenvoegingen zijn het standaard merge-type. Het 'expliciete' deel is dat ze een nieuwe merge commit aanmaken. Dit verandert de commitgeschiedenis en laat expliciet zien waar een merge is uitgevoerd. De inhoud van merge commit is ook expliciet omdat het laat zien welke commits de bovenliggende elementen waren van de merge commit. Sommige teams vermijden expliciete merges omdat de merge commits aantoonbaar 'ruis' toevoegen aan de geschiedenis van het project.

implicit merge via rebase of fast-forward merge

Squash bij samenvoegen, meestal zonder expliciete merge

Opties voor de Git-merge-strategie Recursive


De hierboven geïntroduceerde 'recursive' strategie heeft een eigen subset met aanvullende gebruiksopties.

ours

Verwar dit niet met de merge-strategie Ours. Deze optie conflicteert en wordt automatisch netjes opgelost door de voorkeur te geven aan 'onze' versie. Wijzigingen van de 'hun' kant worden automatisch verwerkt als ze niet met elkaar in conflict zijn.

theirs

Het tegenovergestelde van de 'onze' strategie. De 'hun' optie begunstigt de vreemde merging structuur bij het oplossen van conflicten.

patience

Met deze optie wordt extra tijd besteed aan het voorkomen van onjuiste merges op onbelangrijke overeenkomende regels. Deze optie wordt het best gebruikt wanneer de samen te voegen branches extreem uiteenlopend zijn.

diff-algorithim
ignore-*

    ignore-space-change
    ignore-all-space
    ignore-space-at-eol
    ignore-cr-at-eol

Een set opties die gericht zijn op witruimtetekens. Elke regel die overeenkomt met de subset van de doorgegeven optie, wordt genegeerd.

renormalize

Deze optie checkt alle Git-structuren van de structuur uit en in en lost een merge in drie richtingen op. Deze optie is bedoeld voor branches die worden samengevoegd en die verschillende statussen hebben voor checkin en checkout.

no-normalize

Schakelt de optie hernormaliseren uit. Dit heeft voorrang op de configuratievariabele merge.renormalize.

no-renames

Deze optie negeert hernoemde bestanden tijdens de merge.

find-renames=n

Dit is het standaardgedrag. De recursieve merge zal bestandshernoemingen respecteren. De parameter n kan worden gebruikt om een drempelwaarde door te geven voor de gelijkende hernoeming. De standaardwaarde van n is 100%.

subtree

Deze optie is ontleend aan de `subtree'-strategie. Wanneer de strategie op twee structuren werkt en wijzigt hoe ze bij elkaar passen op een gedeelde voorouder, dan gebruikt deze optie in plaats daarvan de metagegevens van het pad van de structuur om ervoor te zorgen dat ze met elkaar in overeenstemming worden gebracht.

Ons merge-beleid voor Git


Atlassian geeft sterk de voorkeur aan expliciete merges. De reden is heel simpel: expliciete merges bieden een uitstekende traceerbaarheid en context voor de functies die worden samengevoegd. Een rebase om de lokale geschiedenis op te schonen alvorens een functiebranch ter beoordeling te delen is absoluut aan te raden, maar dit verandert het beleid helemaal niet. Het versterkt het.


Deel dit artikel
Volgend onderwerp

Aanbevolen artikelen

Bookmark deze resources voor meer informatie over soorten DevOps-teams of voor voortdurende updates over DevOps bij Atlassian.

Mensen die samenwerken met een muur vol tools

Bitbucket-blog

Toelichting DevOps

DevOps-leertraject

Demo Den Feature-demo's met Atlassian-experts

Hoe Bitbucket Cloud werkt met Atlassian Open DevOps

Meld je aan voor onze DevOps-nieuwsbrief

Thank you for signing up