Close

Git Merge-Strategieoptionen und Beispiele

Wenn ein Teil der Arbeit fertiggestellt, getestet und bereit für die Durchführung des Merge in die Hauptentwicklungslinie ist, muss dein Team einige Strategieentscheidungen treffen. Was sind eure Merge-Strategieoptionen? In diesem Artikel sehen wir uns die Möglichkeiten an und erläutern, wie Atlassian arbeitet. Am Ende haben wir Ihnen hoffentlich einige Hilfsmittel an die Hand gegeben, anhand derer du entscheiden kannst, was für dein Team am besten funktioniert.


Git Merge-Strategien


Ein Merge findet statt, wenn zwei Branches kombiniert werden. Git nimmt dazu zwei (oder mehr) Commit-Pointer und versucht, einen gemeinsamen Basis-Commit zu erstellen. Git hat dabei verschiedene Verfahren, einen Basis-Commit zu finden. Diese werden "Merge-Strategien" genannt. Sobald Git einen gemeinsamen Basis-Commit findet, wird ein neuer "Merge-Commit" erstellt, der Änderungen der angegebenen Merge-Commits kombiniert. Technisch gesehen ist ein Merge-Commit ein normaler Commit, bei dem es nur zwei Vorgänger-Commits gibt.

Einen Merge für Git durchführen

git merge wählt automatisch eine Merge-Strategie aus, außer es ist eine spezielle Strategie angegeben. An die Befehle git merge und git pull kann die Option -s (Strategie) übergeben werden. Die Option -s kann mit dem Namen der gewünschten Merge-Strategie ergänzt werden. Wenn nicht anderweitig angegeben, wählt Git die am besten geeignete Merge-Strategie basierend auf den bereitgestellten Branches aus. Nachfolgend findest du eine Liste der verfügbaren Merge-Strategien.

Konsolenfenster
Zugehöriges Material

Git-Protokoll für Fortgeschrittene

Bitbucket-Logo
Lösung anzeigen

Git kennenlernen mit Bitbucket Cloud

Recursive

git merge -s recursive branch1 branch2

Diese Option funktioniert mit zwei Heads. Recursive ist die standardmäßige Merge-Strategie, wenn für einen Branch ein Pull gezogen oder ein Merge durchgeführt wird. Zusätzlich kann mit dieser Option ein Merge mit Umbenennungen erkannt und abgewickelt werden. Es ist momentan jedoch noch nicht möglich, erkannte Kopien zu nutzen. Dies ist die Standard-Merge-Strategie, wenn für einen Branch ein Pull oder ein Merge durchgeführt wird.

Erledigen

git merge -s resolve branch1 branch2

Diese Option kann zwei Heads mithilfe eines 3-Wege-Merge-Algorithmus erledigen. Dabei wird vorsichtig versucht, Mehrdeutigkeiten über Kreuz zusammenzuführen, was im Allgemeinen als schnell und sicher gilt.

Octopus

git merge -s octopus branch1 branch2 branch3 branchN

Die standardmäßige Merge-Strategie für mehr als zwei Heads. Octopus wird automatisch ausgeführt, wenn mehr als ein Branch weitergegeben wird. Falls ein Merge Konflikte hat, die manuell gelöst werden müssen, lehnt Octopus den Merge-Versuch ab. Diese Option wird primär dafür eingesetzt, ähnliche Feature-Branch-Heads zusammenzufassen.

Ours

git merge -s ours branch1 branch2 branchN

Die Ours-Strategie arbeitet mit einer Anzahl N von Branches. Das ausgegebene Merge-Ergebnis ist immer das des aktuellen Branch-HEAD. Der Begriff "ours" impliziert, dass alle Änderungen von anderen Branches ignoriert werden sollen. Diese Option ist dazu gedacht, den Verlauf von ähnlichen Feature Branches zusammenzuführen.

Subtree

git merge -s subtree branchA branchB

Diese Option ist eine Erweiterung der Recursive-Strategie. Wenn B eine Unterstruktur von A ist, wird beim Mergen von A und B zunächst B aktualisiert, um die Baumstruktur von A abzubilden. Dieses Update wird dann ebenfalls im gemeinsamen Vorgängerbaum durchgeführt, der A und B gemeinsam ist.

Typen von Git Merge-Strategien


Explicit-Merges

Ein Explicit-Merge ist der standardmäßige Merge-Typ. Der "explicit"-Teil besteht darin, dass ein neuer Merge-Commit erstellt wird. Damit wird der Commit-Verlauf verändert und explizit angezeigt, wenn ein Merge durchgeführt wurde. Der Inhalt des Merge-Commit wird also ersichtlich, da angezeigt wird, welche Commit-Vorgänge die Vorgänge des Merge-Commit waren. Manche Teams vermeiden explizite Merges, da durch die Merge-Commits "zusätzliche" Vorgänge in den Verlauf des Projekts hinzugefügt werden.

Implicit-Merge über Rebase oder Fast-Forward-Merge

Squash bei Merge, in der Regel ohne Explicit-Merge

Recursive Git Merge-Strategieoptionen


Die oben vorgestellte "Recursive"-Strategie hat eine eigene Gruppe zusätzlicher Optionen.

ours

Diese Option ist nicht mit der Merge-Strategie "Ours" zu verwechseln. Hier werden Konflikte nicht automatisch sauber gelöst, indem die "Ours"-Version favorisiert wird. Änderungen auf Seiten der "anderen" Branches werden automatisch integriert, wenn keine Konflikte bestehen.

theirs

Die andere Seite bei der "Ours"-Strategie. Bei der Option "Theirs" wird der fremde Merge-Baum bei der Konfliktlösung bevorzugt.

patience

Bei dieser Option ist zusätzliche Zeit dafür vorgesehen, fehlerhafte Merges von unwichtigen passenden Zeilen zu vermeiden. Diese Option wird vorzugsweise eingesetzt, wenn die zu mergenden Branches sehr unterschiedlich sind.

diff-algorithim
ignore-*

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

Eine Reihe von Optionen für Leerzeichen. Alle Zeilen, die Teil der angegebenen Option sind, werden ignoriert.

renormalize

Mit dieser Option werden im Zuge eines 3-Wege-Merge alle drei Git-Bäume aus- und wieder eingecheckt. Diese Option ist dazu gedacht, Branches mit unterschiedlichen Check-in/Check-out-Status zu mergen.

no-normalize

Deaktiviert die Option zur erneuten Normalisierung. Dadurch wird die merge.renormalize-Konfigurationsvariable überschrieben.

no-renames

Diese Option ignoriert beim Merge umbenannte Dateien.

find-renames=n

Das ist das standardmäßige Verhalten. Der Recursive-Merge berücksichtigt umbenannte Dateien. Der Parameter n kann verwendet werden, um einen Schwellenwert für die Umbenennung von Entsprechungen weiterzugeben. Der Standardwert für n ist 100 %.

subtree

Diese Option basiert auf der "Subtree"-Strategie. Während dabei für zwei Bäume ein Merge durchgeführt und dieser bearbeitet wird, damit beide zu einem gemeinsamen Vorgänger passen, zielt diese Strategie auf die Verzeichnis-Metadaten der Struktur ab, um eine Übereinstimmung zu erreichen.

Unsere Git Merge-Richtlinie


Atlassian bevorzugt Explicit Merges. Der Grund dafür ist sehr einfach: Explicit Merges bieten eine gute Nachverfolgbarkeit und Kontext zu den Features, die zusammengeführt werden. Eine Bereinigung des lokalen Verlaufs vor dem Teilen eines Feature Branches für die Prüfung durch Rebase wird unbedingt empfohlen, dies ändert jedoch nichts an der allgemeinen Richtlinie. Sie wird nur dadurch ergänzt.


Diesen Artikel teilen
Nächstes Thema

Lesenswert

Füge diese Ressourcen deinen Lesezeichen hinzu, um mehr über DevOps-Teams und fortlaufende Updates zu DevOps bei Atlassian zu erfahren.

Mitarbeiter arbeiten mit unzähligen Tools zusammen

Bitbucket-Blog

Abbildung: DevOps

DevOps-Lernpfad

Demo Den: Feature-Demos mit Atlassian-Experten

So funktioniert Bitbucket Cloud mit Atlassian Open DevOps

Melde dich für unseren DevOps-Newsletter an

Thank you for signing up