English ▾ Themen ▾ Neueste Version ▾ git-merge zuletzt aktualisiert in 2.52.0

NAME

git-merge - Zwei oder mehr Entwicklungshistorien zusammenführen

SYNOPSIS

git merge [-n] [--stat] [--compact-summary] [--no-commit] [--squash] [--[no-]edit]
	[--no-verify] [-s <strategy>] [-X <strategy-option>] [-S[<keyid>]]
	[--[no-]allow-unrelated-histories]
	[--[no-]rerere-autoupdate] [-m <msg>] [-F <file>]
	[--into-name <branch>] [<commit>…​]
git merge (--continue | --abort | --quit)

BESCHREIBUNG

Integiriert Änderungen von den benannten Commits (seit dem Zeitpunkt, an dem ihre Historien von dem aktuellen Branch abwichen) in den aktuellen Branch. Dieser Befehl wird von git pull verwendet, um Änderungen aus einem anderen Repository zu integrieren, und kann manuell verwendet werden, um Änderungen von einem Branch in einen anderen zu mergen.

Angenommen, die folgende Historie existiert und der aktuelle Branch ist master

          A---B---C topic
         /
    D---E---F---G master

Dann wird git merge topic die Änderungen, die im topic Branch seit seiner Abweichung von master (d.h. E) bis zu seinem aktuellen Commit (C) gemacht wurden, auf master wiederholen und das Ergebnis in einem neuen Commit aufzeichnen, zusammen mit den Namen der beiden Eltern-Commits und einer Log-Nachricht des Benutzers, die die Änderungen beschreibt. Vor der Operation wird ORIG_HEAD auf die Spitze des aktuellen Branches (G) gesetzt.

          A---B---C topic
         /         \
    D---E---F---G---H master

Ein Merge stoppt, wenn es einen Konflikt gibt, der nicht automatisch aufgelöst werden kann, oder wenn --no-commit beim Einleiten des Merges angegeben wurde. Zu diesem Zeitpunkt können Sie git merge --abort oder git merge --continue ausführen.

git merge --abort bricht den Merge-Prozess ab und versucht, den Zustand vor dem Merge wiederherzustellen. Wenn jedoch bei Beginn des Merges unbestätigte Änderungen vorhanden waren (und insbesondere, wenn diese Änderungen nach Beginn des Merges weiter modifiziert wurden), kann git merge --abort in einigen Fällen die ursprünglichen (Vor-Merge-)Änderungen nicht wiederherstellen. Daher

Warnung
Die Ausführung von git merge mit nicht-trivialen, unbestätigten Änderungen wird nicht empfohlen: Obwohl möglich, kann es Sie in einen Zustand versetzen, aus dem im Falle eines Konflikts schwer auszusteigen ist.

OPTIONEN

--commit
--no-commit

Führt den Merge durch und committet das Ergebnis. Diese Option kann verwendet werden, um --no-commit zu überschreiben.

Mit --no-commit wird der Merge durchgeführt und kurz vor dem Erstellen eines Merge-Commits gestoppt, um dem Benutzer die Möglichkeit zu geben, das Merge-Ergebnis zu inspizieren und weiter anzupassen, bevor er es committet.

Beachten Sie, dass Fast-Forward-Updates keinen Merge-Commit erstellen und daher keine Möglichkeit besteht, diese Merges mit --no-commit zu stoppen. Wenn Sie also sicherstellen möchten, dass Ihr Branch durch den Merge-Befehl nicht geändert oder aktualisiert wird, verwenden Sie --no-ff mit --no-commit.

--edit
-e
--no-edit

Ruft einen Editor auf, bevor ein erfolgreicher mechanischer Merge committet wird, um die automatisch generierte Merge-Nachricht weiter zu bearbeiten, damit der Benutzer den Merge erklären und begründen kann. Die Option --no-edit kann verwendet werden, um die automatisch generierte Nachricht zu akzeptieren (dies wird im Allgemeinen nicht empfohlen). Die Option --edit (oder -e) ist immer noch nützlich, wenn Sie mit der Option -m von der Kommandozeile aus eine Entwurfsnachricht angeben und diese im Editor bearbeiten möchten.

Ältere Skripte können vom historischen Verhalten abhängen, das dem Benutzer nicht erlaubt, die Merge-Log-Nachricht zu bearbeiten. Sie sehen einen Editor geöffnet, wenn sie git merge ausführen. Um die Anpassung solcher Skripte an das aktualisierte Verhalten zu erleichtern, kann die Umgebungsvariable GIT_MERGE_AUTOEDIT am Anfang mit no gesetzt werden.

--cleanup=<mode>

Diese Option bestimmt, wie die Merge-Nachricht vor dem Commit bereinigt wird. Weitere Einzelheiten finden Sie in git-commit[1]. Wenn dem <mode> zusätzlich der Wert scissors gegeben wird, werden Scheren an MERGE_MSG angehängt, bevor sie an die Commit-Mechanik im Falle eines Merge-Konflikts weitergegeben werden.

--ff
--no-ff
--ff-only

Gibt an, wie ein Merge behandelt wird, wenn die gemergte Historie bereits ein Nachfahre der aktuellen Historie ist. --ff ist der Standard, es sei denn, ein annotierter (und möglicherweise signierter) Tag wird gemergt, der sich nicht an seinem natürlichen Platz in der refs/tags/ Hierarchie befindet, in diesem Fall wird --no-ff angenommen.

Mit --ff wird, wenn möglich, der Merge als Fast-Forward aufgelöst (nur der Branch-Zeiger wird aktualisiert, um dem gemergten Branch zu entsprechen; kein Merge-Commit wird erstellt). Wenn dies nicht möglich ist (wenn die gemergte Historie kein Nachfahre der aktuellen Historie ist), wird ein Merge-Commit erstellt.

Mit --no-ff wird in allen Fällen ein Merge-Commit erstellt, auch wenn der Merge stattdessen als Fast-Forward aufgelöst werden könnte.

Mit --ff-only wird der Merge als Fast-Forward aufgelöst, wenn möglich. Wenn dies nicht möglich ist, wird der Merge verweigert und mit einem Rückgabewert ungleich Null beendet.

-S[<key-id>]
--gpg-sign[=<key-id>]
--no-gpg-sign

Signiert den resultierenden Merge-Commit mit GPG. Das Argument <key-id> ist optional und standardmäßig die Kommitteur-Identität; wenn es angegeben wird, muss es ohne Leerzeichen an die Option angehängt werden. --no-gpg-sign ist nützlich, um sowohl die Konfigurationsvariable commit.gpgSign als auch frühere --gpg-sign-Aufrufe zu überschreiben.

--log[=<n>]
--no-log

Zusätzlich zu den Branch-Namen werden die Log-Nachricht mit einzeiligen Beschreibungen von höchstens <n> tatsächlich gemergten Commits gefüllt. Siehe auch git-fmt-merge-msg[1].

Mit --no-log werden keine einzeiligen Beschreibungen von den tatsächlich gemergten Commits aufgelistet.

--signoff
--no-signoff

Fügt einen Signed-off-by-Trailer vom Committer am Ende der Commit-Log-Nachricht hinzu. Die Bedeutung eines Sign-offs hängt vom Projekt ab, an das Sie committen. Es kann beispielsweise bestätigen, dass der Committer die Rechte hat, die Arbeit unter der Lizenz des Projekts einzureichen, oder einer bestimmten Beitragsstellervereinbarung zustimmt, wie z. B. einem Developer Certificate of Origin. (Siehe https://developercertificate.org für das von den Linux-Kernel- und Git-Projekten verwendete.) Konsultieren Sie die Dokumentation oder die Führung des Projekts, zu dem Sie beitragen, um zu verstehen, wie die Sign-offs in diesem Projekt verwendet werden.

Die Option --no-signoff kann verwendet werden, um eine frühere Option --signoff auf der Kommandozeile zu widerrufen.

--stat
-n
--no-stat

Zeigt am Ende des Merges einen Diffstat an. Der Diffstat wird auch durch die Konfigurationsoption merge.stat gesteuert.

Mit -n oder --no-stat wird am Ende des Merges kein Diffstat angezeigt.

--compact-summary

Zeigt am Ende des Merges eine kompakte Zusammenfassung an.

--squash
--no-squash

Produziert den Arbeitsbaum und den Index so, als wäre ein echter Merge erfolgt (außer der Merge-Information), aber ohne tatsächlich einen Commit zu machen, HEAD zu bewegen oder $GIT_DIR/MERGE_HEAD aufzuzeichnen (damit der nächste git commit Befehl einen Merge-Commit erstellt). Dies ermöglicht es Ihnen, einen einzigen Commit auf dem aktuellen Branch zu erstellen, dessen Effekt dem Mergen eines anderen Branches entspricht (oder mehr im Falle eines Oktopus).

Mit --no-squash wird der Merge durchgeführt und das Ergebnis committet. Diese Option kann verwendet werden, um --squash zu überschreiben.

Mit --squash ist --commit nicht erlaubt und schlägt fehl.

--verify
--no-verify

Standardmäßig werden die Hooks `pre-merge` und `commit-msg` ausgeführt. Wenn --no-verify angegeben wird, werden diese umgangen. Siehe auch githooks[5].

-s <strategy>
--strategy=<strategy>

Verwendet die angegebene Merge-Strategie; kann mehrfach angegeben werden, um sie in der Reihenfolge zu spezifizieren, in der sie versucht werden sollen. Wenn keine -s-Option angegeben ist, wird stattdessen eine eingebaute Liste von Strategien verwendet (ort beim Mergen eines einzelnen Heads, octopus andernfalls).

-X <option>
--strategy-option=<option>

Übergibt strategie-spezifische Optionen an die Merge-Strategie.

--verify-signatures
--no-verify-signatures

Überprüft, ob der Spitzen-Commit des zu mergenden Seiten-Branches mit einem gültigen Schlüssel signiert ist, d.h. einem Schlüssel mit einer gültigen uid: im Standard-Vertrauensmodell wurde der Signierschlüssel von einem vertrauenswürdigen Schlüssel signiert. Wenn der Spitzen-Commit des Seiten-Branches nicht mit einem gültigen Schlüssel signiert ist, wird der Merge abgebrochen.

--summary
--no-summary

Synonyme für --stat und --no-stat; diese sind veraltet und werden in Zukunft entfernt.

-q
--quiet

Arbeitet im Stillen. Impliziert --no-progress.

-v
--verbose

Ausführlich sein.

--progress
--no-progress

Schaltet die Fortschrittsanzeige explizit ein/aus. Wenn keine der beiden Optionen angegeben ist, wird der Fortschritt angezeigt, wenn Standardfehler mit einem Terminal verbunden ist. Beachten Sie, dass möglicherweise nicht alle Merge-Strategien Fortschrittsberichte unterstützen.

--autostash
--no-autostash

Erstellt automatisch einen temporären Stash-Eintrag, bevor die Operation beginnt, zeichnet ihn im Ref MERGE_AUTOSTASH auf und wendet ihn nach Abschluss der Operation an. Das bedeutet, dass Sie die Operation auf einem schmutzigen Arbeitsbaum ausführen können. Vorsicht: Das abschließende Anwenden des Stashes nach einem erfolgreichen Merge kann zu nicht-trivialen Konflikten führen.

--allow-unrelated-histories

Standardmäßig lehnt der Befehl git merge das Mergen von Historien ab, die keinen gemeinsamen Vorfahren haben. Diese Option kann verwendet werden, um diese Sicherheit zu umgehen, wenn Historien von zwei Projekten gemergt werden, die ihr Leben unabhängig begonnen haben. Da dies ein sehr seltener Fall ist, gibt es keine Konfigurationsvariable, um dies standardmäßig zu aktivieren, und es wird auch keine hinzugefügt werden.

-m <msg>

Setzt die Commit-Nachricht, die für den Merge-Commit verwendet werden soll (falls einer erstellt wird).

Wenn --log angegeben ist, wird eine Kurzfassung der gemergten Commits an die angegebene Nachricht angehängt.

Der Befehl git fmt-merge-msg kann verwendet werden, um eine gute Standardeinstellung für automatisierte git merge Aufrufe zu liefern. Die automatische Nachricht kann die Branch-Beschreibung enthalten.

--into-name <branch>

Bereitet die Standard-Merge-Nachricht so vor, als würde in den Branch <branch> gemergt, anstatt in den Namen des tatsächlichen Branches, in den gemergt wird.

-F <file>
--file=<file>

Liest die Commit-Nachricht, die für den Merge-Commit verwendet werden soll (falls einer erstellt wird).

Wenn --log angegeben ist, wird eine Kurzfassung der gemergten Commits an die angegebene Nachricht angehängt.

--rerere-autoupdate
--no-rerere-autoupdate

Nachdem der rerere-Mechanismus eine aufgezeichnete Auflösung für den aktuellen Konflikt wiederverwendet hat, um die Dateien im Arbeitsbaum zu aktualisieren, erlauben Sie ihm auch, den Index mit dem Ergebnis der Auflösung zu aktualisieren. --no-rerere-autoupdate ist eine gute Möglichkeit, zu überprüfen, was rerere getan hat, und potenzielle Fehlmerges zu erkennen, bevor das Ergebnis mit einem separaten git add in den Index übernommen wird.

--overwrite-ignore
--no-overwrite-ignore

Überschreibt ignorierte Dateien aus dem Merge-Ergebnis stillschweigend. Dies ist das Standardverhalten. Verwenden Sie --no-overwrite-ignore zum Abbrechen.

--abort

Bricht den aktuellen Konfliktlösungs-Prozess ab und versucht, den Zustand vor dem Merge wiederherzustellen. Wenn ein Autostash-Eintrag vorhanden ist, wird er auf den Arbeitsbaum angewendet.

Wenn bei Beginn des Merges unbestätigte Arbeitsbaum-Änderungen vorhanden waren, kann git merge --abort diese Änderungen in einigen Fällen nicht wiederherstellen. Es wird daher empfohlen, Ihre Änderungen immer zu committen oder zu stashen, bevor Sie git merge ausführen.

git merge --abort ist äquivalent zu git reset --merge, wenn MERGE_HEAD vorhanden ist, es sei denn, MERGE_AUTOSTASH ist ebenfalls vorhanden, in diesem Fall wendet git merge --abort den Stash-Eintrag auf den Arbeitsbaum an, während git reset --merge die gestashten Änderungen in der Stash-Liste speichert.

--quit

Vergessen Sie den aktuellen Merge-Vorgang. Lassen Sie den Index und den Arbeitsbaum unverändert. Wenn MERGE_AUTOSTASH vorhanden ist, wird der Stash-Eintrag in der Stash-Liste gespeichert.

--continue

Nachdem git merge aufgrund von Konflikten gestoppt wurde, können Sie den Merge abschließen, indem Sie git merge --continue ausführen (siehe unten den Abschnitt "WIE KONFLIKTE GELÖST WERDEN").

<commit>...

Commits, normalerweise andere Branch-Heads, die in unseren Branch gemergt werden sollen. Die Angabe von mehr als einem Commit erstellt einen Merge mit mehr als zwei Eltern (liebevoll ein Oktopus-Merge genannt).

Wenn keine Commits von der Kommandozeile angegeben werden, werden die Remote-Tracking-Branches gemergt, die der aktuelle Branch als seinen Upstream konfiguriert hat. Siehe auch den Konfigurationsabschnitt dieser Manpage.

Wenn FETCH_HEAD (und kein anderer Commit) angegeben ist, werden die Branches, die in der Datei .git/FETCH_HEAD durch den vorherigen Aufruf von git fetch zum Mergen aufgezeichnet sind, in den aktuellen Branch gemergt.

VOR-MERGE-PRÜFUNGEN

Bevor Sie externe Änderungen anwenden, sollten Sie Ihre eigenen Arbeiten in einem guten Zustand und lokal committet haben, damit sie bei Konflikten nicht überschrieben werden. Siehe auch git-stash[1]. git pull und git merge stoppen ohne etwas zu tun, wenn lokale, unbestätigte Änderungen mit Dateien überlappen, die git pull/git merge möglicherweise aktualisieren muss.

Um zu vermeiden, dass nicht verwandte Änderungen in den Merge-Commit aufgenommen werden, stoppen git pull und git merge auch, wenn Änderungen im Index relativ zum HEAD-Commit registriert sind. (Spezielle, enge Ausnahmen von dieser Regel können je nach verwendeter Merge-Strategie bestehen, aber im Allgemeinen muss der Index mit HEAD übereinstimmen.)

Wenn alle benannten Commits bereits Vorfahren von HEAD sind, beendet sich git merge frühzeitig mit der Meldung "Already up to date.".

FAST-FORWARD-MERGE

Oft ist der aktuelle Branch-Head ein Vorfahre des benannten Commits. Dies ist der häufigste Fall, insbesondere wenn er von git pull aufgerufen wird: Sie verfolgen ein Upstream-Repository, haben keine lokalen Änderungen committet und möchten nun zu einer neueren Upstream-Revision aktualisieren. In diesem Fall ist kein neuer Commit erforderlich, um die kombinierte Historie zu speichern; stattdessen wird HEAD (zusammen mit dem Index) aktualisiert, um auf den benannten Commit zu zeigen, ohne einen zusätzlichen Merge-Commit zu erstellen.

Dieses Verhalten kann mit der Option --no-ff unterdrückt werden.

ECHTER MERGE

Außer bei einem Fast-Forward-Merge (siehe oben) müssen die zu mergenden Branches durch einen Merge-Commit zusammengebunden werden, der beide als Eltern hat.

Eine gemergte Version, die die Änderungen aller zu mergenden Branches zusammenführt, wird committet, und Ihr HEAD, Index und Arbeitsbaum werden darauf aktualisiert. Es ist möglich, Modifikationen im Arbeitsbaum zu haben, solange sie sich nicht überlappen; die Aktualisierung wird sie beibehalten.

Wenn nicht offensichtlich ist, wie die Änderungen zusammengeführt werden können, geschieht Folgendes:

  1. Der HEAD-Zeiger bleibt unverändert.

  2. Der Ref MERGE_HEAD wird so gesetzt, dass er auf den anderen Branch-Head zeigt.

  3. Pfade, die sauber gemergt wurden, werden sowohl in der Indexdatei als auch in Ihrem Arbeitsbaum aktualisiert.

  4. Für widersprüchliche Pfade zeichnet die Indexdatei bis zu drei Versionen auf: Stufe 1 speichert die Version vom gemeinsamen Vorfahren, Stufe 2 von HEAD und Stufe 3 von MERGE_HEAD (Sie können die Stufen mit git ls-files -u einsehen). Die Arbeitsbaum-Dateien enthalten das Ergebnis der Merge-Operation; d.h. 3-Wege-Merge-Ergebnisse mit vertrauten Konfliktmarkern <<< === >>>.

  5. Ein Ref namens AUTO_MERGE wird geschrieben und verweist auf einen Baum, der dem aktuellen Inhalt des Arbeitsbaums entspricht (einschließlich Konfliktmarkern für textuelle Konflikte). Beachten Sie, dass dieser Ref nur geschrieben wird, wenn die ort-Merge-Strategie verwendet wird (der Standard).

  6. Sonstige Änderungen werden nicht vorgenommen. Insbesondere bleiben die lokalen Änderungen, die Sie vor dem Start des Merges hatten, unverändert und die Indexeinträge dafür bleiben wie sie waren, d.h. passend zu HEAD.

Wenn Sie einen Merge versucht haben, der zu komplexen Konflikten geführt hat und Sie neu beginnen möchten, können Sie mit git merge --abort wiederherstellen.

TAG MERGEN

Beim Mergen eines annotierten (und möglicherweise signierten) Tags erstellt Git immer einen Merge-Commit, auch wenn ein Fast-Forward-Merge möglich ist, und die Commit-Nachrichten-Vorlage wird mit der Tag-Nachricht vorbereitet. Zusätzlich wird, wenn der Tag signiert ist, die Signaturprüfung als Kommentar in der Nachrichten-Vorlage gemeldet. Siehe auch git-tag[1].

Wenn Sie nur die Arbeit integrieren möchten, die zu dem Commit geführt hat, der zufällig getaggt wurde, z.B. um mit einem Upstream-Release-Punkt zu synchronisieren, möchten Sie möglicherweise keinen unnötigen Merge-Commit erstellen.

In einem solchen Fall können Sie den Tag selbst "entpacken", bevor Sie ihn an git merge übergeben, oder --ff-only übergeben, wenn Sie keine eigene Arbeit haben. z.B.

git fetch origin
git merge v1.2.3^0
git merge --ff-only v1.2.3

WIE KONFLIKTE DARGESTELLT WERDEN

Während eines Merges werden die Arbeitsbaum-Dateien aktualisiert, um das Ergebnis des Merges widerzuspiegeln. Unter den Änderungen, die an der Version des gemeinsamen Vorfahren vorgenommen wurden, werden nicht überlappende Änderungen (d.h. Sie haben einen Bereich der Datei geändert, während die andere Seite diesen Bereich unverändert gelassen hat, oder umgekehrt) unverändert in das Endergebnis übernommen. Wenn jedoch beide Seiten Änderungen am selben Bereich vorgenommen haben, kann Git nicht willkürlich eine Seite der anderen vorziehen und bittet Sie, dies zu lösen, indem es hinterlässt, was beide Seiten für diesen Bereich getan haben.

Standardmäßig verwendet Git den gleichen Stil wie das Programm "merge" aus der RCS-Suite, um einen solchen widersprüchlichen Hunk darzustellen, wie folgt:

Here are lines that are either unchanged from the common
ancestor, or cleanly resolved because only one side changed,
or cleanly resolved because both sides changed the same way.
<<<<<<< yours:sample.txt
Conflict resolution is hard;
let's go shopping.
=======
Git makes conflict resolution easy.
>>>>>>> theirs:sample.txt
And here is another line that is cleanly resolved or unmodified.

Der Bereich, in dem ein Paar widersprüchlicher Änderungen aufgetreten ist, wird mit den Markierungen <<<<<<<, ======= und >>>>>>> markiert. Der Teil vor dem ======= ist typischerweise Ihre Seite, und der Teil danach ist typischerweise deren Seite.

Das Standardformat zeigt nicht, was das Original im widersprüchlichen Bereich gesagt hat. Sie können nicht erkennen, wie viele Zeilen gelöscht und durch Barbies Bemerkung auf Ihrer Seite ersetzt wurden. Das Einzige, was Sie erkennen können, ist, dass Ihre Seite sagen möchte, dass es schwierig ist und Sie lieber einkaufen gehen würden, während die andere Seite behaupten möchte, es sei einfach.

Ein alternativer Stil kann verwendet werden, indem die Konfigurationsvariable merge.conflictStyle entweder auf diff3 oder zdiff3 gesetzt wird. Im diff3-Stil könnte der obige Konflikt wie folgt aussehen:

Here are lines that are either unchanged from the common
ancestor, or cleanly resolved because only one side changed,
<<<<<<< yours:sample.txt
or cleanly resolved because both sides changed the same way.
Conflict resolution is hard;
let's go shopping.
||||||| base:sample.txt
or cleanly resolved because both sides changed identically.
Conflict resolution is hard.
=======
or cleanly resolved because both sides changed the same way.
Git makes conflict resolution easy.
>>>>>>> theirs:sample.txt
And here is another line that is cleanly resolved or unmodified.

während im zdiff3-Stil könnte er so aussehen:

Here are lines that are either unchanged from the common
ancestor, or cleanly resolved because only one side changed,
or cleanly resolved because both sides changed the same way.
<<<<<<< yours:sample.txt
Conflict resolution is hard;
let's go shopping.
||||||| base:sample.txt
or cleanly resolved because both sides changed identically.
Conflict resolution is hard.
=======
Git makes conflict resolution easy.
>>>>>>> theirs:sample.txt
And here is another line that is cleanly resolved or unmodified.

Zusätzlich zu den Markierungen <<<<<<<, ======= und >>>>>>> wird eine weitere Markierung ||||||| verwendet, der der ursprüngliche Text folgt. Sie können erkennen, dass das Original lediglich eine Tatsache aussagte und Ihre Seite sich dieser Aussage einfach ergab und aufgab, während die andere Seite versuchte, eine positivere Einstellung zu haben. Sie können manchmal eine bessere Lösung finden, indem Sie das Original betrachten.

WIE KONFLIKTE GELÖST WERDEN

Nachdem Sie einen Konflikt gesehen haben, können Sie zwei Dinge tun:

  • Beschließen, nicht zu mergen. Die einzigen Aufräumarbeiten, die Sie benötigen, sind das Zurücksetzen der Indexdatei auf den HEAD-Commit, um 2. rückgängig zu machen, und das Aufräumen der Arbeitsbaum-Änderungen, die durch 2. und 3. gemacht wurden; git merge --abort kann dafür verwendet werden.

  • Die Konflikte lösen. Git wird die Konflikte im Arbeitsbaum markieren. Bearbeiten Sie die Dateien in Form und fügen Sie sie mit git add zum Index hinzu. Verwenden Sie git commit oder git merge --continue, um den Deal abzuschließen. Letzterer Befehl prüft, ob ein (unterbrochener) Merge im Gange ist, bevor git commit aufgerufen wird.

Sie können den Konflikt mit einer Reihe von Werkzeugen durcharbeiten:

  • Verwenden Sie ein Mergetool. git mergetool startet ein grafisches Mergetool, das mit Ihnen den Merge durcharbeitet.

  • Schauen Sie sich die Diffs an. git diff zeigt einen Drei-Wege-Diff an, der Änderungen sowohl von der HEAD- als auch von der MERGE_HEAD-Version hervorhebt. git diff AUTO_MERGE zeigt, welche Änderungen Sie bisher vorgenommen haben, um textuelle Konflikte zu lösen.

  • Schauen Sie sich die Diffs von jedem Branch an. git log --merge -p <path> zeigt zuerst Diffs für die HEAD-Version und dann die MERGE_HEAD-Version an.

  • Sehen Sie sich die Originale an. git show :1:filename zeigt den gemeinsamen Vorfahren, git show :2:filename zeigt die HEAD-Version und git show :3:filename zeigt die MERGE_HEAD-Version.

BEISPIELE

  • Führt die Zweige fixes und enhancements auf dem aktuellen Zweig zusammen und erstellt einen Octopus-Merge.

    $ git merge fixes enhancements
  • Führt den Zweig obsolete in den aktuellen Zweig ein und verwendet die Merge-Strategie ours.

    $ git merge -s ours obsolete
  • Führt den Zweig maint in den aktuellen Zweig ein, erstellt jedoch keinen neuen Commit automatisch.

    $ git merge --no-commit maint

    Dies kann verwendet werden, wenn Sie weitere Änderungen in den Merge einbeziehen möchten oder Ihre eigene Merge-Commit-Nachricht verfassen möchten.

    Sie sollten es vermeiden, diese Option zu missbrauchen, um wesentliche Änderungen in einen Merge-Commit zu schleichen. Kleine Korrekturen wie die Erhöhung des Release-/Versionsnamens wären akzeptabel.

MERGE-STRATEGIEN

Der Merge-Mechanismus (Befehle git merge und git pull) ermöglicht die Auswahl der Backend-Merge-Strategien mit der Option -s. Einige Strategien können auch ihre eigenen Optionen übernehmen, die durch Angabe von -X<option>-Argumenten an git merge und/oder git pull übergeben werden können.

ort

Dies ist die Standard-Merge-Strategie beim Ziehen oder Zusammenführen eines Zweigs. Diese Strategie kann nur zwei Köpfe mithilfe eines 3-Wege-Merge-Algorithmus auflösen. Wenn es mehr als einen gemeinsamen Vorfahren gibt, der für einen 3-Wege-Merge verwendet werden kann, erstellt sie einen zusammengeführten Baum der gemeinsamen Vorfahren und verwendet diesen als Referenzbaum für den 3-Wege-Merge. Dies hat Berichten zufolge zu weniger Merge-Konflikten geführt, ohne Fehl-Merges zu verursachen, basierend auf Tests mit tatsächlichen Merge-Commits aus der Linux 2.6 Kernel-Entwicklungshistorie. Zusätzlich kann diese Strategie Renames erkennen und handhaben. Sie nutzt keine erkannten Kopien. Der Name für diesen Algorithmus ist ein Akronym ("Ostensibly Recursive’s Twin") und stammt daher, dass er als Ersatz für den bisherigen Standardalgorithmus recursive geschrieben wurde.

Wenn der Pfad ein Submodul ist und der auf einer Seite des Merges verwendete Submodul-Commit ein Nachkomme des auf der anderen Seite verwendeten Submodul-Commits ist, versucht Git, zum Nachkommen weiterzuschalten (fast-forward). Andernfalls behandelt Git diesen Fall als Konflikt und schlägt als Auflösung einen Submodul-Commit vor, der ein Nachkomme der konfligierenden ist, falls ein solcher existiert.

Die ort-Strategie kann die folgenden Optionen übernehmen.

ours

Diese Option erzwingt, dass widersprüchliche Hunks automatisch sauber aufgelöst werden, indem die Version von uns bevorzugt wird. Änderungen vom anderen Baum, die nicht mit unserer Seite kollidieren, spiegeln sich im Merge-Ergebnis wider. Bei einer Binärdatei wird der gesamte Inhalt von unserer Seite übernommen.

Dies darf nicht mit der Merge-Strategie ours verwechselt werden, die überhaupt nicht prüft, was der andere Baum enthält. Sie verwirft alles, was der andere Baum getan hat, und erklärt, dass unsere Historie alles enthält, was darin geschehen ist.

theirs

Dies ist das Gegenteil von ours; beachten Sie, dass es im Gegensatz zu ours keine theirs-Merge-Strategie gibt, mit der diese Merge-Option verwechselt werden könnte.

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

Behandelt Zeilen mit der angegebenen Art von Leerzeichenänderung für den Zweck eines 3-Wege-Merges als unverändert. Leerzeichenänderungen, die mit anderen Änderungen an einer Zeile vermischt sind, werden nicht ignoriert. Siehe auch git-diff[1] -b, -w, --ignore-space-at-eol und --ignore-cr-at-eol.

  • Wenn die Version des Gegners nur Leerzeichenänderungen an einer Zeile vornimmt, wird die Version von uns verwendet;

  • Wenn die Version von uns Leerzeichenänderungen vornimmt, aber die Version des Gegners eine wesentliche Änderung enthält, wird die Version des Gegners verwendet;

  • Andernfalls wird der Merge wie üblich durchgeführt.

renormalize

Dies führt einen virtuellen Check-out und Check-in aller drei Stufen jeder Datei durch, die einen 3-Wege-Merge benötigt. Diese Option ist für das Zusammenführen von Zweigen mit unterschiedlichen Clean-Filtern oder Normalisierungsregeln für Zeilenenden gedacht. Details finden Sie im Abschnitt "Merging branches with differing checkin/checkout attributes" in gitattributes[5].

no-renormalize

Deaktiviert die Option renormalize. Dies überschreibt die Konfigurationsvariable merge.renormalize.

find-renames[=<n>]

Aktiviert die Erkennung von Renames, optional mit Angabe der Ähnlichkeitsschwelle. Dies ist die Standardeinstellung. Dies überschreibt die Konfigurationsvariable merge.renames. Siehe auch git-diff[1] --find-renames.

rename-threshold=<n>

Veraltete Synonym für find-renames=<n>.

no-renames

Deaktiviert die Erkennung von Renames. Dies überschreibt die Konfigurationsvariable merge.renames. Siehe auch git-diff[1] --no-renames.

histogram

Veraltetes Synonym für diff-algorithm=histogram.

patience

Veraltetes Synonym für diff-algorithm=patience.

diff-algorithm=(histogram|minimal|myers|patience)

Verwendet einen anderen Diff-Algorithmus beim Zusammenführen, was helfen kann, Fehl-Merges zu vermeiden, die aufgrund von unwichtigen übereinstimmenden Zeilen (wie Klammern aus verschiedenen Funktionen) auftreten. Siehe auch git-diff[1] --diff-algorithm. Beachten Sie, dass ort standardmäßig diff-algorithm=histogram verwendet, während normale Diffs derzeit standardmäßig die Einstellung diff.algorithm verwenden.

subtree[=<path>]

Diese Option ist eine weiterentwickelte Form der Subtree-Strategie, bei der die Strategie versucht, wie zwei Bäume aufeinander abgestimmt werden müssen, wenn sie zusammengeführt werden. Stattdessen wird der angegebene Pfad vorangestellt (oder vom Anfang gestrippt), um die Form zweier Bäume abzugleichen.

recursive

Dies ist jetzt ein Synonym für ort. Es war bis v2.49.0 eine alternative Implementierung, wurde aber ab v2.50.0 auf ort umgeleitet. Die frühere rekursive Strategie war die Standardstrategie zur Auflösung von zwei Köpfen von Git v0.99.9k bis v2.33.0.

resolve

Dies kann nur zwei Köpfe (d. h. den aktuellen Zweig und einen anderen, von dem Sie gezogen haben) mithilfe eines 3-Wege-Merge-Algorithmus auflösen. Es versucht, Mehrdeutigkeiten bei Kreuz-Merges sorgfältig zu erkennen. Es verarbeitet keine Renames.

octopus

Dies löst Fälle mit mehr als zwei Köpfen, lehnt jedoch komplexe Merges ab, die eine manuelle Auflösung erfordern. Er ist hauptsächlich dafür gedacht, Topic-Zweig-Köpfe zu bündeln. Dies ist die Standard-Merge-Strategie, wenn mehr als ein Zweig gezogen oder zusammengeführt wird.

ours

Dies löst eine beliebige Anzahl von Köpfen auf, aber der resultierende Baum des Merges ist immer der des aktuellen Zweigkopfs, wodurch alle Änderungen von allen anderen Zweigen effektiv ignoriert werden. Er ist dafür gedacht, alte Entwicklungshistorien von Seitenästen zu ersetzen. Beachten Sie, dass dies sich von der Option -Xours für die ort-Merge-Strategie unterscheidet.

subtree

Dies ist eine modifizierte ort-Strategie. Beim Zusammenführen der Bäume A und B, wenn B einem Unterverzeichnis von A entspricht, wird B zuerst angepasst, um der Baumstruktur von A zu entsprechen, anstatt die Bäume auf derselben Ebene zu lesen. Diese Anpassung erfolgt auch für den gemeinsamen Vorfahrenbaum.

Bei den Strategien, die einen 3-Wege-Merge verwenden (einschließlich der Standardstrategie ort), wird eine Änderung, die auf beiden Zweigen vorgenommen wurde, aber später auf einem der Zweige rückgängig gemacht wurde, im zusammengeführten Ergebnis enthalten sein; einige Leute empfinden dieses Verhalten als verwirrend. Es tritt auf, weil nur die Köpfe und die Merge-Basis bei der Durchführung eines Merges berücksichtigt werden, nicht jedoch die einzelnen Commits. Der Merge-Algorithmus betrachtet daher die rückgängig gemachte Änderung als keine Änderung und ersetzt sie durch die geänderte Version.

KONFIGURATION

branch.<name>.mergeOptions

Legt Standardoptionen für das Zusammenführen in Zweig <name> fest. Die Syntax und die unterstützten Optionen sind die gleichen wie bei git merge, aber Optionswerte, die Leerzeichen enthalten, werden derzeit nicht unterstützt.

Alles oberhalb dieser Zeile in diesem Abschnitt ist nicht in der Dokumentation von git-config[1] enthalten. Der nachfolgende Inhalt ist derselbe wie dort zu finden.

merge.conflictStyle

Gibt den Stil an, in dem widersprüchliche Hunks beim Zusammenführen in Arbeitsbaumdateien geschrieben werden. Der Standard ist "merge", der eine <<<<<<<-Konfliktmarkierung, Änderungen einer Seite, eine =======-Markierung, Änderungen der anderen Seite und dann eine >>>>>>>-Markierung anzeigt. Ein alternativer Stil, "diff3", fügt eine |||||||-Markierung und den ursprünglichen Text vor der =======-Markierung hinzu. Der "merge"-Stil neigt dazu, kleinere Konfliktregionen als diff3 zu erzeugen, sowohl aufgrund des Ausschlusses des ursprünglichen Textes als auch weil, wenn ein Teil der Zeilen auf beiden Seiten übereinstimmt, sie einfach aus der Konfliktregion herausgezogen werden. Ein weiterer alternativer Stil, "zdiff3", ist ähnlich wie diff3, entfernt aber übereinstimmende Zeilen auf beiden Seiten aus der Konfliktregion, wenn diese übereinstimmenden Zeilen nahe dem Anfang oder Ende einer Konfliktregion erscheinen.

merge.defaultToUpstream

Wenn merge ohne Commit-Argument aufgerufen wird, werden die für den aktuellen Zweig konfigurierten Upstream-Zweige anhand ihrer zuletzt beobachteten Werte, die in ihren Remote-Tracking-Zweigen gespeichert sind, zusammengeführt. Die Werte von branch.<current branch>.merge, die die Zweige unter dem von branch.<current-branch>.remote benannten Namen angeben, werden konsultiert und dann über remote.<remote>.fetch ihren entsprechenden Remote-Tracking-Zweigen zugeordnet, und die Spitzen dieser Tracking-Zweige werden zusammengeführt. Standardmäßig ist dies true.

merge.ff

Standardmäßig erstellt Git keinen zusätzlichen Merge-Commit, wenn ein Commit zusammengeführt wird, der ein Nachkomme des aktuellen Commits ist. Stattdessen wird die Spitze des aktuellen Zweigs durchgeschaltet (fast-forward). Wenn dieser Wert auf false gesetzt ist, weist diese Variable Git an, in einem solchen Fall einen zusätzlichen Merge-Commit zu erstellen (entspricht der Angabe der Option --no-ff auf der Befehlszeile). Wenn dieser Wert auf only gesetzt ist, sind nur solche Fast-Forward-Merges zulässig (entspricht der Angabe der Option --ff-only auf der Befehlszeile).

merge.verifySignatures

Wenn true, ist dies äquivalent zur Befehlszeilenoption --verify-signatures. Siehe git-merge[1] für Details.

merge.branchdesc

Befüllt zusätzlich zu den Zweignamen die Log-Nachricht mit dem zugehörigen Beschriftungstext des Zweigs. Standardmäßig false.

merge.log

Befüllt zusätzlich zu den Zweignamen die Log-Nachricht mit höchstens der angegebenen Anzahl von Einzeilenbeschreibungen aus den tatsächlich zusammengeführten Commits. Standardmäßig false, und true ist ein Synonym für 20.

merge.suppressDest

Durch Hinzufügen eines Glob-Musters, das die Namen von Integrationszweigen übereinstimmt, zu dieser mehrwertigen Konfigurationsvariablen wird die für Merges in diese Integrationszweige berechnete Standard-Merge-Nachricht "into <branch-name>" aus ihrem Titel weglassen.

Ein Element mit einem leeren Wert kann verwendet werden, um die Liste der Globs zu löschen, die aus früheren Konfigurationseinträgen angesammelt wurden. Wenn keine Variable merge.suppressDest definiert ist, wird standardmäßig master aus Gründen der Abwärtskompatibilität verwendet.

merge.renameLimit

Die Anzahl der Dateien, die im erschöpfenden Teil der Rename-Erkennung während eines Merges berücksichtigt werden. Wenn nicht angegeben, wird der Wert von diff.renameLimit verwendet. Wenn weder merge.renameLimit noch diff.renameLimit angegeben sind, beträgt der Standardwert derzeit 7000. Diese Einstellung hat keine Auswirkung, wenn die Rename-Erkennung deaktiviert ist.

merge.renames

Ob Git Renames erkennt. Wenn auf false gesetzt, ist die Rename-Erkennung deaktiviert. Wenn auf true gesetzt, ist die grundlegende Rename-Erkennung aktiviert. Standardmäßig wird der Wert von diff.renames verwendet.

merge.directoryRenames

Ob Git Verzeichnis-Renames erkennt, was sich darauf auswirkt, was zum Zeitpunkt des Merges mit neuen Dateien geschieht, die einem Verzeichnis auf einer Seite der Historie hinzugefügt wurden, während dieses Verzeichnis auf der anderen Seite der Historie umbenannt wurde. Mögliche Werte sind:

false

Die Erkennung von Verzeichnis-Renames ist deaktiviert, was bedeutet, dass solche neuen Dateien im alten Verzeichnis verbleiben.

true

Die Erkennung von Verzeichnis-Renames ist aktiviert, was bedeutet, dass solche neuen Dateien in das neue Verzeichnis verschoben werden.

conflict

Ein Konflikt wird für solche Pfade gemeldet.

Wenn merge.renames false ist, wird merge.directoryRenames ignoriert und als false behandelt. Standardmäßig ist es conflict.

merge.renormalize

Teilt Git mit, dass sich die kanonische Darstellung von Dateien im Repository im Laufe der Zeit geändert hat (z. B. frühere Commits speichern Textdateien mit CRLF-Zeilenenden, aber neuere verwenden LF-Zeilenenden). In einem solchen Repository kann Git für jede Datei, bei der ein 3-Wege-Inhalts-Merge erforderlich ist, die in Commits gespeicherten Daten vor dem Merge in eine kanonische Form konvertieren, um unnötige Konflikte zu reduzieren. Weitere Informationen finden Sie im Abschnitt "Merging branches with differing checkin/checkout attributes" in gitattributes[5].

merge.stat

Was, wenn überhaupt, zwischen ORIG_HEAD und dem Merge-Ergebnis am Ende des Merges gedruckt werden soll. Mögliche Werte sind:

false

Nichts anzeigen.

true

Zeigt git diff --diffstat --summary ORIG_HEAD an.

compact

Zeigt git diff --compact-summary ORIG_HEAD an.

aber jeder nicht erkannte Wert (z. B. ein Wert, der von einer zukünftigen Git-Version hinzugefügt wurde) wird als true interpretiert, anstatt einen Fehler auszulösen. Standardmäßig ist es true.

merge.autoStash

Wenn dies auf true gesetzt ist, wird vor Beginn des Vorgangs automatisch ein temporärer Stash-Eintrag erstellt und nach Abschluss des Vorgangs angewendet. Das bedeutet, dass Sie einen Merge auf einem nicht bereinigten Arbeitsbaum ausführen können. Verwenden Sie dies jedoch mit Vorsicht: das abschließende Anwenden des Stashs nach einem erfolgreichen Merge kann zu nicht trivialen Konflikten führen. Diese Option kann durch die Optionen --no-autostash und --autostash von git-merge[1] überschrieben werden. Standardmäßig ist sie false.

merge.tool

Steuert, welcher Merge-Tool von git-mergetool[1] verwendet wird. Die folgende Liste zeigt die gültigen integrierten Werte. Jeder andere Wert wird als benutzerdefiniertes Merge-Tool behandelt und erfordert die Definition einer entsprechenden Variablen mergetool.<tool>.cmd.

merge.guitool

Steuert, welcher Merge-Tool von git-mergetool[1] verwendet wird, wenn das Flag -g/--gui angegeben ist. Die folgende Liste zeigt die gültigen integrierten Werte. Jeder andere Wert wird als benutzerdefiniertes Merge-Tool behandelt und erfordert die Definition einer entsprechenden Variablen mergetool.<guitool>.cmd.

  • araxis

  • bc

  • codecompare

  • deltawalker

  • diffmerge

  • diffuse

  • ecmerge

  • emerge

  • examdiff

  • guiffy

  • gvimdiff

  • kdiff3

  • meld

  • nvimdiff

  • opendiff

  • p4merge

  • smerge

  • tkdiff

  • tortoisemerge

  • vimdiff

  • vscode

  • winmerge

  • xxdiff

merge.verbosity

Steuert die Menge der vom rekursiven Merge-Algorithmus angezeigten Ausgaben. Stufe 0 gibt nichts aus, außer einer abschließenden Fehlermeldung, wenn Konflikte erkannt wurden. Stufe 1 gibt nur Konflikte aus, Stufe 2 gibt Konflikte und Dateiänderungen aus. Stufe 5 und höher gibt Debugging-Informationen aus. Der Standard ist Stufe 2. Kann durch die Umgebungsvariable GIT_MERGE_VERBOSITY überschrieben werden.

merge.<driver>.name

Definiert einen lesbaren Namen für einen benutzerdefinierten Low-Level-Merge-Treiber. Siehe gitattributes[5] für Details.

merge.<driver>.driver

Definiert den Befehl, der einen benutzerdefinierten Low-Level-Merge-Treiber implementiert. Siehe gitattributes[5] für Details.

merge.<driver>.recursive

Benennt einen Low-Level-Merge-Treiber, der bei der internen Zusammenführung zwischen gemeinsamen Vorfahren verwendet wird. Siehe gitattributes[5] für Details.

GIT

Teil der git[1] Suite