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

NAME

git-mergetool - Konfliktlösungs-Tools zum Beheben von Merge-Konflikten ausführen

SYNOPSIS

git mergetool [--tool=<tool>] [-y | --[no-]prompt] [<file>…​]

BESCHREIBUNG

Verwenden Sie git mergetool, um eines von mehreren Merge-Dienstprogrammen zum Beheben von Merge-Konflikten auszuführen. Es wird typischerweise nach git merge ausgeführt.

Wenn ein oder mehrere <Datei>-Parameter angegeben werden, wird das Merge-Tool-Programm ausgeführt, um Unterschiede in jeder Datei zu beheben (Dateien ohne Konflikte werden übersprungen). Die Angabe eines Verzeichnisses schließt alle ungelösten Dateien in diesem Pfad ein. Wenn keine <Datei>-Namen angegeben werden, führt git mergetool das Merge-Tool-Programm für jede Datei mit Merge-Konflikten aus.

OPTIONEN

-t <tool>
--tool=<tool>

Verwenden Sie das durch <tool> angegebene Merge-Auflösungsprogramm. Gültige Werte sind emerge, gvimdiff, kdiff3, meld, vimdiff und tortoisemerge. Führen Sie git mergetool --tool-help aus, um die Liste der gültigen <tool>-Einstellungen anzuzeigen.

Wenn kein Merge-Auflösungsprogramm angegeben ist, verwendet git mergetool die Konfigurationsvariable merge.tool. Wenn die Konfigurationsvariable merge.tool nicht gesetzt ist, wählt git mergetool einen geeigneten Standardwert.

Sie können einen vollständigen Pfad zum Tool explizit angeben, indem Sie die Konfigurationsvariable mergetool.<tool>.path setzen. Zum Beispiel können Sie den absoluten Pfad zu kdiff3 konfigurieren, indem Sie mergetool.kdiff3.path setzen. Andernfalls geht git mergetool davon aus, dass das Tool in $PATH verfügbar ist.

Anstatt eines der bekannten Merge-Tool-Programme auszuführen, kann git mergetool so angepasst werden, dass ein alternatives Programm ausgeführt wird, indem die aufzurufende Befehlszeile in der Konfigurationsvariable mergetool.<tool>.cmd angegeben wird.

Wenn git mergetool mit diesem Tool aufgerufen wird (entweder über die Option -t oder --tool oder die Konfigurationsvariable merge.tool), wird die konfigurierte Befehlszeile mit BASE auf den Namen einer temporären Datei gesetzt, die die gemeinsame Basis für den Merge enthält, falls vorhanden; LOCAL wird auf den Namen einer temporären Datei gesetzt, die den Inhalt der Datei im aktuellen Branch enthält; REMOTE wird auf den Namen einer temporären Datei gesetzt, die den Inhalt der zu mergenden Datei enthält, und MERGED wird auf den Namen der Datei gesetzt, in die das Merge-Tool das Ergebnis der Merge-Auflösung schreiben soll.

Wenn das benutzerdefinierte Merge-Tool den Erfolg einer Merge-Auflösung korrekt mit seinem Exit-Code anzeigt, kann die Konfigurationsvariable mergetool.<tool>.trustExitCode auf true gesetzt werden. Andernfalls wird git mergetool den Benutzer auffordern, den Erfolg der Auflösung nach dem Beenden des benutzerdefinierten Tools anzuzeigen.

--tool-help

Zeigt eine Liste der Merge-Tools an, die mit --tool verwendet werden können.

-y
--no-prompt

Fordert nicht vor jeder Ausführung des Merge-Auflösungsprogramms zur Bestätigung auf. Dies ist der Standard, wenn das Merge-Auflösungsprogramm explizit mit der Option --tool oder mit der Konfigurationsvariable merge.tool angegeben wird.

--prompt

Fordert vor jeder Ausführung des Merge-Auflösungsprogramms zur Bestätigung auf, um dem Benutzer die Möglichkeit zu geben, den Pfad zu überspringen.

-g
--gui

Wenn git-mergetool mit der Option -g oder --gui aufgerufen wird, wird das Standard-Merge-Tool aus der konfigurierten Variablen merge.guitool anstelle von merge.tool gelesen. Wenn merge.guitool nicht gesetzt ist, wird auf das unter merge.tool konfigurierte Tool zurückgegriffen. Dies kann über die Konfigurationsvariable mergetool.guiDefault automatisch ausgewählt werden.

--no-gui

Dies überschreibt eine vorherige Einstellung von -g oder --gui oder die Konfiguration mergetool.guiDefault und liest das Standard-Merge-Tool aus der konfigurierten Variablen merge.tool.

-O<orderfile>

Verarbeitet Dateien in der im <orderfile> angegebenen Reihenfolge, die eine Shell-Glob-Muster pro Zeile enthält. Dies überschreibt die Konfigurationsvariable diff.orderFile (siehe git-config[1]). Um diff.orderFile abzubrechen, verwenden Sie -O/dev/null.

KONFIGURATION

Alles unterhalb dieser Zeile in diesem Abschnitt wird selektiv aus der git-config[1]-Dokumentation übernommen. Der Inhalt ist derselbe wie dort zu finden.

mergetool.<tool>.path

Überschreibt den Pfad für das angegebene Tool. Dies ist nützlich, falls Ihr Tool nicht in $PATH ist.

mergetool.<tool>.cmd

Gibt den auszuführenden Befehl für das angegebene Merge-Tool an. Der angegebene Befehl wird in der Shell mit den folgenden verfügbaren Variablen ausgewertet: BASE ist der Name einer temporären Datei, die die gemeinsame Basis der zu mergenden Dateien enthält, falls vorhanden; LOCAL ist der Name einer temporären Datei, die den Inhalt der Datei im aktuellen Branch enthält; REMOTE ist der Name einer temporären Datei, die den Inhalt der Datei aus dem zu mergenden Branch enthält; MERGED enthält den Namen der Datei, in die das Merge-Tool die Ergebnisse eines erfolgreichen Merges schreiben soll.

mergetool.<tool>.hideResolved

Ermöglicht dem Benutzer, den globalen Wert mergetool.hideResolved für ein bestimmtes Tool zu überschreiben. Die vollständige Beschreibung finden Sie unter mergetool.hideResolved.

mergetool.<tool>.trustExitCode

Gibt für einen benutzerdefinierten Merge-Befehl an, ob der Exit-Code des Merge-Befehls verwendet werden kann, um festzustellen, ob der Merge erfolgreich war. Wenn dies nicht auf true gesetzt ist, wird der Zeitstempel der Merge-Ziel-Datei überprüft, und der Merge wird als erfolgreich angenommen, wenn die Datei aktualisiert wurde; andernfalls wird der Benutzer aufgefordert, den Erfolg des Merges anzuzeigen.

mergetool.meld.hasOutput

Ältere Versionen von meld unterstützen die Option --output nicht. Git versucht zu erkennen, ob meld --output unterstützt, indem die Ausgabe von meld --help analysiert wird. Die Konfiguration von mergetool.meld.hasOutput bewirkt, dass Git diese Prüfungen überspringt und stattdessen den konfigurierten Wert verwendet. Das Setzen von mergetool.meld.hasOutput auf true weist Git an, die Option --output bedingungslos zu verwenden, und false vermeidet die Verwendung von --output.

mergetool.meld.useAutoMerge

Wenn --auto-merge angegeben wird, führt meld automatisch alle nicht-konfliktierenden Teile zusammen, hebt die konfliktierenden Teile hervor und wartet auf die Entscheidung des Benutzers. Das Setzen von mergetool.meld.useAutoMerge auf true weist Git an, die Option --auto-merge mit meld bedingungslos zu verwenden. Ein Wert von auto lässt Git erkennen, ob --auto-merge unterstützt wird, und verwendet --auto-merge nur, wenn es verfügbar ist. Ein Wert von false vermeidet die Verwendung von --auto-merge vollständig und ist der Standardwert.

mergetool.<variant>.layout

Konfiguriert das Layout des geteilten Fensters für die <variant> von vimdiff, welche vimdiff, nvimdiff oder gvimdiff sein kann. Beim Starten von git mergetool mit --tool=<variant> (oder ohne --tool, wenn merge.tool als <variant> konfiguriert ist) konsultiert Git mergetool.<variant>.layout, um das Layout des Tools zu bestimmen. Wenn die variantenspezifische Konfiguration nicht verfügbar ist, wird vimdiff's als Fallback verwendet. Wenn auch das nicht verfügbar ist, wird ein Standardlayout mit 4 Fenstern verwendet. Informationen zur Konfiguration des Layouts finden Sie im Abschnitt HINWEISE ZU BACKEND-SPEZIFISCHEN FUNKTIONEN.

mergetool.hideResolved

Während eines Merges löst Git automatisch so viele Konflikte wie möglich und schreibt die Datei $MERGED, die Konfliktmarker um alle Konflikte enthält, die es nicht lösen kann; $LOCAL und $REMOTE sind normalerweise die Versionen der Datei von vor der Konfliktlösung durch Git. Dieses Flag bewirkt, dass $LOCAL und $REMOTE überschrieben werden, sodass nur die ungelösten Konflikte dem Merge-Tool präsentiert werden. Kann pro Tool über die Konfigurationsvariable mergetool.<tool>.hideResolved konfiguriert werden. Standardwert ist false.

mergetool.keepBackup

Nachdem ein Merge durchgeführt wurde, kann die Originaldatei mit Konfliktmarkern als Datei mit der Erweiterung .orig gespeichert werden. Wenn diese Variable auf false gesetzt ist, wird diese Datei nicht beibehalten. Standardwert ist true (d. h. die Backup-Dateien behalten).

mergetool.keepTemporaries

Beim Aufruf eines benutzerdefinierten Merge-Tools verwendet Git eine Reihe von temporären Dateien, die dem Tool übergeben werden. Wenn das Tool einen Fehler zurückgibt und diese Variable auf true gesetzt ist, werden diese temporären Dateien beibehalten; andernfalls werden sie nach dem Beenden des Tools entfernt. Standardwert ist false.

mergetool.writeToTemp

Git schreibt standardmäßig temporäre Versionen der Dateien BASE, LOCAL und REMOTE im Arbeitsverzeichnis. Wenn diese Einstellung auf true gesetzt ist, versucht Git, ein temporäres Verzeichnis für diese Dateien zu verwenden. Standardwert ist false.

mergetool.prompt

Fordert vor jeder Ausführung des Merge-Auflösungsprogramms zur Bestätigung auf.

mergetool.guiDefault

Setzen Sie auf true, um standardmäßig merge.guitool zu verwenden (entspricht der Angabe des Arguments --gui), oder auf auto, um merge.guitool oder merge.tool basierend auf dem Vorhandensein einer DISPLAY-Umgebungsvariablen auszuwählen. Der Standardwert ist false, bei dem das Argument --gui explizit angegeben werden muss, damit merge.guitool verwendet wird.

TEMPORÄRE DATEIEN

git mergetool erstellt während der Auflösung von Merges *.orig-Backup-Dateien. Diese können sicher entfernt werden, sobald eine Datei gemergt wurde und ihre git mergetool-Sitzung abgeschlossen ist.

Das Setzen der Konfigurationsvariable mergetool.keepBackup auf false bewirkt, dass git mergetool die Backup-Dateien automatisch entfernt, wenn Dateien erfolgreich gemergt wurden.

HINWEISE ZU BACKEND-SPEZIFISCHEN FUNKTIONEN

vimdiff

Beschreibung

Wenn --tool=vimdiff in git mergetool angegeben wird, öffnet Git Vim mit einem 4-Fenster-Layout, das wie folgt verteilt ist:

------------------------------------------
|             |           |              |
|   LOCAL     |   BASE    |   REMOTE     |
|             |           |              |
------------------------------------------
|                                        |
|                MERGED                  |
|                                        |
------------------------------------------

LOCAL, BASE und REMOTE sind schreibgeschützte Puffer, die den Inhalt der konfliktierenden Datei in bestimmten Commits anzeigen ("Commit, in den Sie mergen", "gemeinsamer Vorfahren-Commit" und "Commit, von dem Sie mergen" jeweils).

MERGED ist ein beschreibbarer Puffer, in dem Sie die Konflikte lösen müssen (unter Verwendung der anderen schreibgeschützten Puffer als Referenz). Sobald Sie fertig sind, speichern und beenden Sie Vim wie gewohnt (:wq) oder, wenn Sie abbrechen möchten, beenden Sie mit :cq.

Layout-Konfiguration

Sie können das von Vim verwendete Fensterlayout ändern, indem Sie die Konfigurationsvariable mergetool.vimdiff.layout setzen, die einen String akzeptiert, in dem die folgenden Trennzeichen eine besondere Bedeutung haben:

  • + wird verwendet, um "einen neuen Tab zu öffnen"

  • , wird verwendet, um "einen neuen vertikalen Split zu öffnen"

  • / wird verwendet, um "einen neuen horizontalen Split zu öffnen"

  • @ wird verwendet, um die Datei anzugeben, die die endgültige Version nach der Lösung der Konflikte enthält. Wenn nicht vorhanden, wird standardmäßig MERGED verwendet.

Die Priorität der Operatoren ist wie folgt (Sie können Klammern verwenden, um sie zu ändern)

`@` > `+` > `/` > `,`

Sehen wir uns einige Beispiele an, um zu verstehen, wie es funktioniert

  • layout = "(LOCAL,BASE,REMOTE)/MERGED"

    Dies ist genau dasselbe wie das Standardlayout, das wir bereits gesehen haben.

    Beachten Sie, dass / Vorrang vor , hat und daher die Klammern in diesem Fall nicht benötigt werden. Die folgende Layoutdefinition ist äquivalent:

    layout = "LOCAL,BASE,REMOTE / MERGED"
  • layout = "LOCAL,MERGED,REMOTE"

    Wenn wir aus irgendeinem Grund nicht an dem BASE-Puffer interessiert sind.

    ------------------------------------------
    |             |           |              |
    |             |           |              |
    |   LOCAL     |   MERGED  |   REMOTE     |
    |             |           |              |
    |             |           |              |
    ------------------------------------------
  • layout = "MERGED"

    Nur der MERGED-Puffer wird angezeigt. Beachten Sie jedoch, dass alle anderen Puffer immer noch in Vim geladen sind und Sie mit dem Befehl "buffers" darauf zugreifen können.

    ------------------------------------------
    |                                        |
    |                                        |
    |                 MERGED                 |
    |                                        |
    |                                        |
    ------------------------------------------
  • layout = "@LOCAL,REMOTE"

    Wenn MERGED nicht im Layout vorhanden ist, müssen Sie einen der Puffer mit einem Arobase (@) "markieren". Dies wird der Puffer sein, den Sie bearbeiten und speichern müssen, nachdem Sie die Konflikte gelöst haben.

    ------------------------------------------
    |                   |                    |
    |                   |                    |
    |                   |                    |
    |     LOCAL         |    REMOTE          |
    |                   |                    |
    |                   |                    |
    |                   |                    |
    ------------------------------------------
  • layout = "LOCAL,BASE,REMOTE / MERGED + BASE,LOCAL + BASE,REMOTE"

    Drei Tabs werden geöffnet: Der erste ist eine Kopie des Standardlayouts, während die beiden anderen nur die Unterschiede zwischen (BASE und LOCAL) und (BASE und REMOTE) anzeigen.

    ------------------------------------------
    | <TAB #1> |  TAB #2  |  TAB #3  |       |
    ------------------------------------------
    |             |           |              |
    |   LOCAL     |   BASE    |   REMOTE     |
    |             |           |              |
    ------------------------------------------
    |                                        |
    |                MERGED                  |
    |                                        |
    ------------------------------------------
    ------------------------------------------
    |  TAB #1  | <TAB #2> |  TAB #3  |       |
    ------------------------------------------
    |                   |                    |
    |                   |                    |
    |                   |                    |
    |     BASE          |    LOCAL           |
    |                   |                    |
    |                   |                    |
    |                   |                    |
    ------------------------------------------
    ------------------------------------------
    |  TAB #1  |  TAB #2  | <TAB #3> |       |
    ------------------------------------------
    |                   |                    |
    |                   |                    |
    |                   |                    |
    |     BASE          |    REMOTE          |
    |                   |                    |
    |                   |                    |
    |                   |                    |
    ------------------------------------------
  • layout = "LOCAL,BASE,REMOTE / MERGED + BASE,LOCAL + BASE,REMOTE + (LOCAL/BASE/REMOTE),MERGED"

    Wie im vorherigen Beispiel, fügt jedoch einen vierten Tab mit denselben Informationen wie im ersten Tab hinzu, jedoch mit einem anderen Layout.

    ---------------------------------------------
    |  TAB #1  |  TAB #2  |  TAB #3  | <TAB #4> |
    ---------------------------------------------
    |       LOCAL         |                     |
    |---------------------|                     |
    |       BASE          |        MERGED       |
    |---------------------|                     |
    |       REMOTE        |                     |
    ---------------------------------------------

    Beachten Sie, wie wir im dritten Tab-Definitionsblock Klammern verwenden müssen, damit , Vorrang vor / hat.

Varianten

Anstelle von --tool=vimdiff können Sie auch eine der folgenden Varianten verwenden:

  • --tool=gvimdiff, um gVim anstelle von Vim zu öffnen.

  • --tool=nvimdiff, um Neovim anstelle von Vim zu öffnen.

Bei Verwendung dieser Varianten müssen Sie zur Angabe eines benutzerdefinierten Layouts die Konfigurationsvariablen mergetool.gvimdiff.layout und mergetool.nvimdiff.layout anstelle von mergetool.vimdiff.layout setzen (wobei letztere als Fallback verwendet wird, wenn die variantenspezifische nicht gesetzt ist).

Zusätzlich können Sie für die Abwärtskompatibilität mit früheren Git-Versionen 1, 2 oder 3 an entweder vimdiff oder eine der Varianten anhängen (z. B. vimdiff3, nvimdiff1 usw.), um ein vordefiniertes Layout zu verwenden. Mit anderen Worten, die Verwendung von --tool=[g|n]vimdiff<x> ist dasselbe wie die Verwendung von --tool=[g|n]vimdiff und das Setzen der Konfigurationsvariable mergetool.[g|n]vimdiff.layout auf…​

  • <x>=1: "@LOCAL, REMOTE"

  • <x>=2: "LOCAL, MERGED, REMOTE"

  • <x>=3: "MERGED"

Beispiel: Die Verwendung von --tool=gvimdiff2 öffnet gvim mit drei Spalten (LOCAL, MERGED und REMOTE).

GIT

Teil der git[1] Suite