Wie man Zusammenführungskonflikte in Git löst

Wie löse ich Zusammenführungskonflikte in Git?

Lösung

Versuchen Sie es: git mergetool

Es öffnet eine grafische Benutzeroberfläche, die Sie schrittweise durch jeden Konflikt führt, und Sie können wählen, wie er zusammengeführt werden soll. Manchmal muss man danach noch ein wenig von Hand nachbearbeiten, aber normalerweise reicht es aus. Es ist auf jeden Fall viel besser als die ganze Sache von Hand zu machen.

Wie von @JoshGlover kommentiert:

Der Befehl öffnet nicht unbedingt eine grafische Benutzeroberfläche, es sei denn, Sie installieren eine. Die Ausführung von git mergetool führte bei mir dazu, dass vimdiff verwendet wurde. Sie können eines der folgenden Werkzeuge installieren, um es stattdessen zu verwenden: meld, opendiff, kdiff3, tkdiff, xxdiff, tortoisemerge, gvimdiff, diffuse, ecmerge, p4merge, araxis, vimdiff, emerge.

Unten ist ein Beispiel für die Verwendung von vimdiff zur Lösung von Konflikten beim Zusammenführen. Basierend auf diesem Link

Schritt 1: Führen Sie folgende Befehle in Ihrem Terminal aus

git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false

Dadurch wird vimdiff als Standard-Zusammenführungswerkzeug festgelegt.

Schritt 2: Führen Sie folgenden Befehl im Terminal aus

git mergetool

Schritt 3: Sie werden eine vimdiff-Anzeige im folgenden Format sehen

  ╔═══════╦══════╦════════╗
  ║       ║      ║        ║
  ║ LOCAL ║ BASE ║ REMOTE ║
  ║       ║      ║        ║
  ╠═══════╩══════╩════════╣
  ║                       ║
  ║        MERGED         ║
  ║                       ║
  ╚═══════════════════════╝

Diese 4 Ansichten sind

LOKAL - dies ist die Datei aus dem aktuellen Zweig

BASE - gemeinsamer Vorgänger, wie die Datei vor beiden Änderungen aussah

REMOTE - Datei, die Sie in Ihren Zweig einbinden

MERGED - Ergebnis der Zusammenführung, das im Projektarchiv gespeichert wird

Sie können zwischen diesen Ansichten mit ctrl+w navigieren. Die MERGED-Ansicht erreichen Sie direkt mit ctrl+w gefolgt von j.

Mehr Infos zur vimdiff-Navigation hier und hier

Schritt 4. Sie können die MERGED-Ansicht auf folgende Weise bearbeiten

Wenn Sie Änderungen von REMOTE erhalten wollen

:diffg RE  

Wenn Sie Änderungen von BASE abrufen möchten

:diffg BA  

Wenn Sie Änderungen von LOCAL abrufen möchten

:diffg LO 

Schritt 5. Speichern, Beenden, Bestätigen und Aufräumen

:wqa Speichern und Beenden von vi

git commit -m "Nachricht"

git clean Entfernen Sie zusätzliche Dateien (z.B. *.orig), die vom Diff-Tool erstellt wurden.

Kommentare (20)
  1. Stellen Sie fest, welche Dateien in Konflikt stehen (Git sollte Ihnen das sagen).

  2. Öffnen Sie jede Datei und untersuchen Sie die Diffs; Git grenzt sie ab. Hoffentlich ist es offensichtlich, welche Version eines jeden Blocks beibehalten werden soll. Möglicherweise müssen Sie dies mit anderen Entwicklern besprechen, die den Code übertragen haben.

  3. Sobald Sie den Konflikt in einer Datei gelöst haben, fügen Sie git add the_file hinzu.

  4. Sobald Sie alle Konflikte aufgelöst haben, führen Sie git rebase --continue oder den Befehl Git sagte, dass du das tun sollst, wenn du fertig bist.

Kommentare (7)

Wenn Sie häufig kleine Übertragungen vornehmen, dann schauen Sie sich zunächst die Übertragungskommentare mit git log --merge an. Dann wird Ihnen git diff die Konflikte zeigen.

Bei Konflikten, die mehr als ein paar Zeilen umfassen, ist es einfacher, mit einem externen GUI-Tool zu sehen, was vor sich geht. Ich mag opendiff -- Git unterstützt auch vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff, emerge von Haus aus und Sie können weitere installieren: git config merge.tool "your.tool" setzt das von Ihnen gewählte Tool und dann zeigt Ihnen git mergetool nach einem fehlgeschlagenen Merge die Diffs im Kontext.

Jedes Mal, wenn Sie eine Datei bearbeiten, um einen Konflikt aufzulösen, wird git add filename den Index aktualisieren und Ihr Diff wird ihn nicht mehr anzeigen. Wenn alle Konflikte beseitigt sind und die Dateien mit git add bearbeitet wurden, schließt git commit die Zusammenführung ab.

Kommentare (1)