Zum Inhalt springen

Merge-Strategien

mergeconflicts

Git-Merge-Strategien

Wenn die Arbeit abgeschlossen und bereit ist, in die Hauptentwicklungslinie zusammengeführt zu werden, sollten wir eine Merge-Strategie wählen.

Git kombiniert Änderungen aus verschiedenen Branches mithilfe unterschiedlicher Methoden, die als „Merge-Strategien“ bekannt sind. Nach der Auswahl einer Merge-Strategie erstellt Git einen neuen Merge-Commit, der die Änderungen der angegebenen Branches zusammenführt. Wenn nichts angegeben ist, wählt der Befehl git merge automatisch eine Merge-Strategie basierend auf den angegebenen Branches aus. Mit der Option -s kann der Name der Strategie angegeben werden. Hier ist die Liste der Merge-Strategien:

Recursive

git merge recursive strategy

bash
git merge -s recursive branch_name

Git wählt recursive als Standardstrategie, wenn Branches zusammengeführt oder gepullt werden. Die recursive-Strategie kann Merges erkennen und verwalten, die Umbenennungen beinhalten, kann jedoch erkannte Kopien nicht verwenden.

Resolve

merge resolve strategy

bash
git merge -s resolve branch_name

Die resolve-Strategie verwendet einen 3-Wege-Merge zum Auflösen von Branches und kann nur zwei HEADs mithilfe eines 3-Wege-Merge-Algorithmus auflösen. Sie ist sicher und schnell und erkennt Criss-Cross-Merge-Ambiguitäten im Detail.

Octopus

merge octopus strategy

bash
git merge -s octopus branch1 branch2 branch3

Wenn mehrere Branches an den Merge-Befehl übergeben werden, kann die octopus-Strategie verwendet werden, um sie in einem einzigen Commit zusammenzuführen. Octopus verweigert den Merge, wenn Konflikte vorhanden sind, die eine manuelle Auflösung erfordern. Die grundlegende Verwendung von Octopus besteht darin, HEADs von Feature-Branches mit Ähnlichkeiten zu bündeln.

Ours

merge ours strategy

bash
git merge -s ours branch_name

Die ours-Strategie löst mehrere Branches zusammen, aber das Ergebnis ist immer das des aktuellen Branch-HEADs. Sie ignoriert alle Änderungen aller anderen Branches sehr effektiv. Sie ist dafür gedacht, eine alte Historie von Neben-Branches zu ersetzen.

Subtree

merge subtree strategy

bash
git merge -s subtree branch_name

Die subtree-Strategie ist die modifizierte Version der recursive-Strategie. Wenn beispielsweise die Bäume A und B zusammengeführt werden, wird B beim Bezug auf einen Unterbaum von A zunächst so angepasst, dass die Baumstruktur von A widergespiegelt wird. Die Anpassung kann am gemeinsamen Vorfahrenbaum von A und B vorgenommen werden.

Arten von Git-Merge-Strategien

Merge-Commits (Explizit)

Explizite Merges gelten als der Standard-Merge-Typ. Sie werden explizit genannt, weil sie einen neuen Merge-Commit erstellen, die Historie ändern und anzeigen, wo der Merge ausgelöst wurde. Der Inhalt des Merge-Commits gilt ebenfalls als explizit, da er die Eltern-Commits des Merge-Commits anzeigt.

Fast-Forward-Merges (Implizit)

Fast-Forward-Merges erstellen keinen Merge-Commit. Sie verschieben lediglich den Zeiger des Ziel-Branches vorwärts auf den neuesten Commit des Quell-Branches. Dieses Verhalten wird automatisch ausgelöst, wenn sich der Ziel-Branch nicht vom Quell-Branch abgespalten hat.

Squash-Merges

Squash ist eine Merge-Option, die das Erstellen eines Merge-Commits vermeidet. Ein Squash-Merge nimmt alle Commits aus dem Quell-Branch und kombiniert sie zu einem einzigen neuen Commit, der dann auf den Ziel-Branch angewendet wird. Dies wird typischerweise mit dem Flag --squash während eines Merges oder eines interaktiven Rebase ausgeführt. Die Commit-Historie des Quell-Branches wird zu einem einzigen zusammengefassten Commit auf dem Ziel-Branch.

Optionen der rekursiven Git-Merge-Strategie

oursErzwingt, dass konfliktbehaftete Teile automatisch aufgelöst werden, indem die eigene Version bevorzugt wird. Die Änderungen aus dem anderen Baum, die nicht mit unserer Seite in Konflikt stehen, werden im Merge-Ergebnis berücksichtigt.
theirsBevorzugt den anderen zusammengeführten Baum bei der Konfliktauflösung. Anders als bei „ours“ gibt es keine „theirs“-Merge-Strategie.
patienceVerbringt viel Zeit damit, Fehlzusammenführungen zu vermeiden, die aufgrund unwichtiger übereinstimmender Zeilen auftreten.
diff-algorithmWeist „merge-recursive“ an, einen anderen Diff-Algorithmus zu verwenden, der hilft, Fehlzusammenführungen bei unwichtigen übereinstimmenden Zeilen zu vermeiden.
ignore-space-change / ignore-all-spaceBezieht sich auf Leerzeichenzeichen. Änderungen an Leerzeichen, die mit anderen Änderungen vermischt sind, werden nicht ignoriert.
renormalizeFührt beim Auflösen eines 3-Wege-Merges einen Check-out und Check-in auf allen Dateistufen aus.
no-normalizeDeaktiviert die Option renormalize.
no-renamesIgnoriert umbenannte Dateien während des Merges.
find-renames=nAktiviert die Erkennung von Umbenennungen mit einem Ähnlichkeitsschwellenwert. Der Standardwert ist 50 %.
subtreeArbeitet mit den Pfadmetadaten des Baums, damit die Bäume übereinstimmen.

Practice

What are the different merge strategies in Git and their characteristics?

Finden Sie das nützlich?

Dual-run-Vorschau — vergleichen Sie mit den Symfony-Routen live.