Merge-Strategien

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
git merge -s recursive branch_nameGit 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
git merge -s resolve branch_nameDie 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
git merge -s octopus branch1 branch2 branch3Wenn 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
git merge -s ours branch_nameDie 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
git merge -s subtree branch_nameDie 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
| ours | Erzwingt, 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. |
|---|---|
| theirs | Bevorzugt den anderen zusammengeführten Baum bei der Konfliktauflösung. Anders als bei „ours“ gibt es keine „theirs“-Merge-Strategie. |
| patience | Verbringt viel Zeit damit, Fehlzusammenführungen zu vermeiden, die aufgrund unwichtiger übereinstimmender Zeilen auftreten. |
| diff-algorithm | Weist „merge-recursive“ an, einen anderen Diff-Algorithmus zu verwenden, der hilft, Fehlzusammenführungen bei unwichtigen übereinstimmenden Zeilen zu vermeiden. |
| ignore-space-change / ignore-all-space | Bezieht sich auf Leerzeichenzeichen. Änderungen an Leerzeichen, die mit anderen Änderungen vermischt sind, werden nicht ignoriert. |
| renormalize | Führt beim Auflösen eines 3-Wege-Merges einen Check-out und Check-in auf allen Dateistufen aus. |
| no-normalize | Deaktiviert die Option renormalize. |
| no-renames | Ignoriert umbenannte Dateien während des Merges. |
| find-renames=n | Aktiviert die Erkennung von Umbenennungen mit einem Ähnlichkeitsschwellenwert. Der Standardwert ist 50 %. |
| subtree | Arbeitet mit den Pfadmetadaten des Baums, damit die Bäume übereinstimmen. |
Practice
What are the different merge strategies in Git and their characteristics?