2013-02-15 8 views
97

Ich habe gerade einen Zweig in meinem Master in Git zusammengeführt und ich habe Automatic merge failed; fix conflicts and then commit the result. Jetzt lief ich git mergetool und vimdiff geöffnet mit dem Bild unten. Ich weiß nicht, wie man vimdiff benutzt. Was bedeutet jedes Panel hier und wie soll ich vorgehen, um den Merge-Konflikt zu beheben?Wie verwende ich vimdiff, um einen Konflikt zu lösen?

enter image description here

+2

Siehe [diese Seite] (http://vim.wikia.com/wiki/A_better_Vimdiff_Git_mergetool). Wenn Sie das mit "richtig" meinen, steht der aktuelle Status Ihres Codes oben links. – romainl

+0

@romainl Ich bin immer noch verwirrt nach dem Lesen, was sind die Verknüpfungen und wie wähle ich welche Datei als Hauptzweig verwenden? –

+2

@Danny [http://www.rosipov.com/blog/use-vimdiff-as-git-mergetool/](http://www.rosipov.com/blog/use-vimdiff-as-git-mergetool/) ist ein guter. –

Antwort

100

Alle vier Puffer bieten eine andere Ansicht der gleichen Datei. Der obere linke Puffer (LOCAL) ist, wie die Datei in Ihrem Zielzweig (in was Sie hineinfließen) geschaut wurde. Der obere rechte Puffer (REMOTE) ist, wie die Datei in Ihrem Quellzweig (aus dem Sie zusammengeführt werden) aussieht. Der mittlere Puffer (BASE) ist der gemeinsame Vorfahre der beiden (Sie können also vergleichen, wie die linke und die rechte Version voneinander abweichen).

Ich kann auf dem folgenden Punkt falsch sein. Ich denke, die Quelle des Zusammenführungskonflikts besteht darin, dass beide Dateien den gleichen Teil der Datei seit BASE geändert haben; LOCAL hat die Anführungszeichen von Double in Single geändert, und REMOTE hat dieselbe Änderung vorgenommen, aber auch den Hintergrundwert von einer Farbe in eine URL geändert. (Ich denke, die Zusammenführung ist nicht intelligent genug, um zu bemerken, dass alle Änderungen an LOCAL auch in REMOTE vorhanden sind; es weiß nur, dass LOCAL seit BASE Änderungen an denselben Stellen vorgenommen hat wie REMOTE).

In jedem Fall enthält der untere Puffer die Datei, die Sie tatsächlich bearbeiten können — die in Ihrem Arbeitsverzeichnis sitzt. Sie können Änderungen vornehmen, die Ihnen gefallen. vim zeigt Ihnen, wie es sich von jeder der Top-Ansichten unterscheidet, die Bereiche sind, die die automatische Zusammenführung nicht verarbeiten konnte. Ziehen Sie Änderungen von LOCAL, wenn die REMOTE nicht geändert werden soll. Ziehen Sie Änderungen von REMOTE, wenn Sie diese den LOKALEN Änderungen vorziehen. Ziehen Sie von BASE, wenn Sie denken, dass sowohl REMOTE als auch LOCAL falsch sind. Tun Sie etwas ganz anderes, wenn Sie eine bessere Idee haben! Am Ende sind die Änderungen, die Sie hier vornehmen, diejenigen, die tatsächlich begangen werden.

+2

Schnelle Frage Wie speichere ich in vim? –

+3

': x' oder': w' (': x' wird ebenfalls beendet) plus 'return'. –

+4

Anders: Es gibt andere Zusammenführungswerkzeuge, die Sie verwenden können, wenn Sie nicht mit der Verwendung von 'vim' vertraut sind. – chepner

9

@ chepners Antwort ist großartig, ich möchte einige Details zu "wie sollte ich fortfahren, um den Konflikt zu beheben Konflikt" Teil der Frage hinzufügen. Wenn Sie in diesem Fall prüfen, wie Sie vimdiff verwenden können, geht es unter.


Zuerst die „Abbruch alles“ Option Adresse - wenn Sie „vimdiff“ nicht verwenden möchten, und die Zusammenführung abbrechen wollen: Drücken Sie Esc, dann :qa! ein und drücken eingeben. (siehe auch How to exit the Vim editor?). Git wird Sie dann fragen, ob die Zusammenführung abgeschlossen wurde, antworten Sie mit n.


Wenn Sie vimdiff verwenden möchten, hier sind einige nützliche Verknüpfungen.Dies setzt voraus, Sie wissen, Grundlagen der Vim (Navigation und insert/Normalbetrieb):

  • zum unteren Puffer navigieren (merge Ergebnis): Ctrl-Wj
  • mit j zum nächsten diff navigieren/k; oder besser verwenden ]c und [c zum nächsten und vorherigen diff zu navigieren bzw.
  • Verwendung zo, während auf einer Falte um es zu öffnen, wenn Sie mehr sehen wollen Kontext
  • für jeden diff, wie pro Antwort des @ chepner, Sie entweder die Version von Code aus lokalen, entfernten oder Basisversion es bekommen kann und Redo, oder bearbeiten, wie Sie fit
    • t sehen o erhalten sie von der lokalen Version verwenden :diffget LO
    • von remote: :diffget RE
    • von der Basis: :diffget BA
    • oder, wenn Sie selbst bearbeiten möchten, zunächst eine Version von lokalen/remote/Base, und dann gehen Sie zu einfügen-Modus und bearbeiten Sie den Rest
  • einmal getan, das Merge Ergebnis speichern, und schließen Sie alle Fenster :wqa
  • normalerweise erkennt git, dass Merge getan wurde und vervollständigt die Zusammenführung verpflichten

Sie können im Internet nach anderen vimdiff-Verknüpfungen suchen. Ich fand diese zum Beispiel nützlich: https://gist.github.com/hyamamoto/7783966

+0

Dies sollte x1000-mal aktualisiert und als eine bessere Antwort akzeptiert werden. –