Ich habe gerade einen Zweig mit meinem Master in Git zusammengeführt und Automatic merge failed; fix conflicts and then commit the result.
jetzt habe ich git mergetool
gerannt und vimdiff mit dem Bild unten geöffnet. Ich weiß nicht, wie man Vimdiff benutzt. Was bedeutet jedes Panel hier und wie soll ich vorgehen, um den Zusammenführungskonflikt zu beheben?
159
Antworten:
Alle vier Puffer bieten eine unterschiedliche Ansicht derselben Datei. Der obere linke Puffer (LOCAL) gibt an, wie die Datei in Ihrem Zielzweig aussah (in was Sie zusammenführen). Der obere rechte Puffer (REMOTE) gibt an, wie die Datei in Ihrem Quellzweig aussah (von wo aus Sie zusammenführen). Der mittlere Puffer (BASE) ist der gemeinsame Vorfahr der beiden (Sie können also vergleichen, wie die linke und die rechte Version voneinander abweichen).
Ich kann mich in folgendem Punkt irren. Ich denke, die Ursache des Zusammenführungskonflikts ist, dass beide Dateien seit BASE denselben Teil der Datei geändert haben. LOCAL hat die Anführungszeichen von doppelt in einfach 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 klug genug, um festzustellen, dass alle Änderungen an LOCAL auch in REMOTE vorhanden sind. Es ist nur bekannt, dass LOCAL seit BASE an denselben Stellen wie REMOTE Änderungen vorgenommen hat.)
In jedem Fall enthält der untere Puffer die Datei, die Sie tatsächlich bearbeiten können - die Datei, die sich in Ihrem Arbeitsverzeichnis befindet. Sie können beliebige Änderungen vornehmen.
vim
zeigt Ihnen, wie es sich von den einzelnen Draufsichten unterscheidet. Dies sind die Bereiche, die bei der automatischen Zusammenführung nicht behandelt werden konnten. Ziehen Sie Änderungen aus LOCAL, wenn Sie die REMOTE-Änderungen nicht möchten. Ziehen Sie Änderungen aus FERN, wenn Sie diese den LOKALEN Änderungen vorziehen. Ziehen Sie von BASE ab, wenn Sie der Meinung sind, dass sowohl REMOTE als auch LOCAL falsch sind. Mach etwas ganz anderes, wenn du eine bessere Idee hast! Letztendlich sind die Änderungen, die Sie hier vornehmen, diejenigen, die tatsächlich festgeschrieben werden.quelle
:x
oder:w
(auch:x
Exits) plus 'return'.vim
.Die Antwort von @ chepner ist großartig. Ich möchte einige Details zum Teil "Wie soll ich vorgehen, um den Zusammenführungskonflikt zu beheben?" der Frage hinzufügen. Wenn Sie sich ansehen, wie Sie vimdiff in diesem Fall tatsächlich verwenden, finden Sie weiter unten Informationen.
Um zunächst die Option "Alles abbrechen" anzusprechen - wenn Sie "vimdiff" nicht verwenden und die Zusammenführung abbrechen möchten: Drücken Sie Esc, geben Sie ein
:qa!
und drücken Sie Enter. (Siehe auch Wie beende ich den Vim-Editor? ) Git wird Sie fragen, ob die Zusammenführung abgeschlossen ist. Antworten Sie mitn
.Wenn Sie vimdiff verwenden möchten, finden Sie hier einige nützliche Verknüpfungen. Dies setzt voraus, dass Sie die Grundlagen von Vim kennen (Navigation und Einfügen / Normalmodus):
:diffget LO
:diffget RE
:diffget BA
:wqa
:cquit
stattdessen mit: Wie brechen Sie ein externes Git-Diff ab?Es scheint nicht möglich zu sein, sowohl lokale als auch Remote-Konflikt-Hunks ohne Einfügen von Kopien oder benutzerdefinierte Verknüpfungen hinzuzufügen: /vi/10534/is-there-a-way-to-take-both- Wenn Sie vim-as-merge-tool verwenden , ist das eine Schande, da add add ein so häufiger Konflikttyp ist.
Um zu verhindern, dass vimdiff Sie bei jedem Start auffordert, die Eingabetaste zu drücken, fügen Sie Folgendes hinzu
.vimrc
:wie erwähnt unter: /vi/771/how-can-i-suppress-the-press-enter-prompt-when-opening-files-in-diff-mode
Sie können im Internet nach anderen vimdiff-Verknüpfungen suchen. Ich fand dieses nützlich: https://gist.github.com/hyamamoto/7783966
quelle
:diffget
.Das ultimative Mergetool, um vimdiff zu ersetzen
Das ist eine Art Augenzwinkern, aber es ist das, worauf ich mich nach dem Versuch von vimdiff als Vimmer konzentriert habe.
Um einen Zusammenführungskonflikt zu lösen, muss ich fast immer Folgendes sehen:
um dann zu versuchen, beide zusammenzufügen.
Während vimdiff BASE, LOCAL und REMOTE auf dem Bildschirm anzeigt:
Ich weiß nicht, wie ich die beiden Unterschiede, die ich außerdem brauche, deutlich machen kann, indem ich ein paar Mal nach rechts, links, rechts und links schaue.
Außerdem sind LOCAL und REMOTE bereits in den Konfliktmarkierungen für Git-Merge sichtbar, sodass ich nicht so viel von einem Tool profitiere, das sie erneut anzeigt.
Deshalb habe ich stattdessen mein eigenes kleines "Difftool" erstellt, das tatsächlich die Unterschiede zeigt, die mir fehlten:
~ / bin / cirosantilli-mergetool
GitHub stromaufwärts .
Und installieren Sie es mit:
Wenn Sie dies tun:
Es zeigt die beiden Unterschiede, die ich auf dem Terminal haben möchte, z. B. etwas entlang:
Sie können hier also die beiden im Terminal abgelegten Diffs sehen:
RealView_BASE_15560.py
vs.RealView_LOCAL_15560.py
RealView_BASE_15560.py
vs.RealView_REMOTE_15560.py
Wenn die Unterschiede groß sind, suche ich einfach nach meinen tmux-Superkräften .
Ja, Sie verlieren zwar einige von vimdiff bereitgestellte Verknüpfungen, aber im Allgemeinen erfordert das Lösen von Konflikten ein sorgfältiges Kopieren und Einfügen aus beiden Versionen, was ich in einer normalen vim-Sitzung mit den Git-Konfliktmarkierungen problemlos tun kann.
Beobachten und Verteilen von Dateien während der
vimdiff
AusführungBevor ich mich
cirosantilli-mergetool
hinsetzte und mein perfektes Setup mit automatisierte , tat ich Folgendes, um die beiden Unterschiede zu erreichen, die ich brauchte.Wenn während der
git mergetool
Ausführungvimdiff
ein Konflikt mit einer Datei mit dem Namen z. B.main.py
auftritt, generiert git Dateien für jede der folgenden Versionen:im selben Verzeichnis wie
main.py
wo1367
ist die PID von git mergetool und daher eine "zufällige" Ganzzahl, wie unter: Welche BACKUP-, BASE-, LOCAL- und REMOTE-Dateien werden in einem Git-Merge-Konflikt generiert?Um die gewünschten Unterschiede zu sehen, finde ich zuerst die generierten Dateien mit
git status
, öffne dann neue Terminals und mache einen Vimdiff zwischen den Dateipaaren, die mir wichtig sind:Zusammen mit
git mergetool
helfen diese Informationen VIEL, schnell herauszufinden, was los ist!Auch wenn mergetool ausgeführt wird, können Sie die Datei einfach öffnen:
direkt und bearbeiten Sie es dort, wenn Sie der Meinung sind, dass es mit einem größeren Editorfenster einfacher wird.
Springe direkt, um Konflikte zusammenzuführen
Während
]c
in vimdiff zum nächsten Diff-Punkt gesprungen wird, gibt es dort nicht immer einen Zusammenführungskonflikt.Um dies zu unterstützen, habe ich in meinem
~/.vimrc
:das findet die Konflikte direkt.
git imerge
Vielleicht ist die beste Option, einfach auf die Verwendung von vimdiff zu verzichten und sich auf reguläres vim + git imerge zu verlassen, das unter folgendem erwähnt wurde: Wie kann ich herausfinden, welche Git-Commits Konflikte verursachen? da die Lernkurve von vimdiff ärgerlich ist und nicht die Funktionen erfüllt, die wir am meisten benötigen.
quelle