So führen Sie Git-Konflikte in Emacs zusammen


84

Meine letzte Git-Fusion hat zu einer großen Anzahl von Konflikten geführt. Mein aktueller Ansatz besteht darin, nach dem nächsten Auftreten von "<<<" zu suchen und dann die Zusammenführung durch Standard-Textbearbeitung durchzuführen.

Frage : Gibt es eine Möglichkeit, wie Emacs das Zusammenführen unter Verwendung der in Git verfügbaren Informationen zu meiner Version, ihrer Version und der Basisversion der Datei unterstützen kann?


Bearbeiten: Diese Frage hat einen anderen Umfang als diese verwandte Frage , da sie nicht auf das Aufrufen von ediff beschränkt ist.


7
Wenn Sie Magit verwenden möchten, können Sie den Statuspuffer laden und dann eauf Dateien drücken , die als Konflikt angezeigt werden. Magit startet ediffdie Zusammenführung und fordert Sie anschließend auf, Ihre Änderungen zu bestätigen. Anschließend können Sie die zusammengeführte Datei bereitstellen.
wvxvw

@ Anfänger: 3 andere Leute dachten, es sei ein Duplikat, und ich war die letzte Abstimmung. Warum: Der andere Thread gibt die gleichen Antworten ( smergeund vc-resolve-conflictauch einen an ediff) und gibt es schon länger. Ich bin damit einverstanden, dass der erste Thread einen besseren Titel verwenden könnte.
Dan

@Dan stimme ich nicht zu: es ist eine andere Frage und dass die Antworten ähnlich sind, ändert nichts daran.
Anfänger

1
@IqbalAnsari: Ich denke, der andere Thread braucht einen besseren Titel, damit die Leute ihn leichter finden können. In der Tat denke ich, Anfängertitel wäre toll dafür. Warten wir jedoch ein wenig, um zu sehen, ob die Leute diesen Thread wieder öffnen möchten. Wenn nicht, wäre ich dafür, den ersten Thread mit dem Titel des Anfängers umzubenennen.
Dan

1
Und für das, was es wert ist, denke ich, dass dies eine gute Frage mit guten Antworten ist. Es ist nur so, dass ich auch denke, dass es ein Duplikat ist - aber andere mögen diese Meinung nicht teilen (also über die Duplikation).
Dan

Antworten:


86

Vielleicht möchten Sie es einfach ausprobieren, smerge-modeindem Sie die in Konflikt stehende Datei öffnen und ausführen M-xsmerge-modeRET. Es werden alle Konfliktregionen hervorgehoben. Es werden auch Tastenkombinationen hinzugefügt C-hfsmerge-modeRET, um die Konflikte einfach zu lösen. Informationen dazu finden Sie in der Dokumentation .

Standardpräfix

Ich finde das Standardpräfix für smerge-mode C-c^umständlich, daher habe ich es in geändert C-cv

(setq smerge-command-prefix "\C-cv")

Wichtige Tastenkombinationen

Für mich sind die wichtigsten Bindungen:

smerge-nextverpflichtet, smerge-command-prefixnzum nächsten Konflikt zu bewegen.

smerge-previousverpflichtet, smerge-command-prefixpzum vorherigen Konflikt zu bewegen.

smerge-keep-currentverpflichtet smerge-command-prefixRET, die Version beizubehalten, auf der sich der Cursor befindet.

smerge-keep-mineverpflichtet smerge-command-prefixm, Ihre Änderungen zu behalten.

smerge-keep-otherverpflichtet smerge-command-prefixo, andere Änderungen beizubehalten.

smerge-ediffverpflichtet, smerge-command-prefixEeine Ediff-Sitzung zu starten, um die Konflikte zusammenzuführen. Dies ist dasselbe wie vc-resolve-conflicts(danke @phils und @Malabarba für den Hinweis).

Smerge-Modus automatisch aktivieren

UPDATE: Folgendes ist nur für frühere Emacs-Versionen relevant 25.1, das Folgende kann in späteren Versionen zu Problemen führen (siehe https://github.com/magit/magit/issues/3897)

Außerdem könnten Sie daran interessiert sein, die automatische Aktivierung smerge-modebeim Aufrufen einer Datei / eines Puffers mit Konfliktmarkierungen zu aktivieren. Dazu können Sie Folgendes verwenden

(defun my-enable-smerge-maybe ()
  (when (and buffer-file-name (vc-backend buffer-file-name))
    (save-excursion
      (goto-char (point-min))
      (when (re-search-forward "^<<<<<<< " nil t)
        (smerge-mode +1)))))

(add-hook 'buffer-list-update-hook #'my-enable-smerge-maybe)

Beachten Sie, dass ich einen Puffer verwende buffer-list-update-hookund nicht, find-file-hookda ich die meiste Zeit Konflikte in einem Puffer erhalte, der bereits in Emacs geöffnet ist. In diesem Fall find-file-hookist dies keine Hilfe.

Überprüfen Sie auch andere in dieser Antwort erwähnte Methoden


1
(1) Vergiss nicht smerge-ediff. (2) Auf welcher Emacs-Version bist du? Auf dem aktuellen Emacs-Master-Zweig wird Smerge automatisch aktiviert. (3) Warum verwenden Sie buffer-list-update-hookstatt find-file-hook?
Malabarba,

Beachten Sie zur weiteren Verdeutlichung, dass smerge-ediffund vc-resolve-conflictsdasselbe sind.
Phils

@Malabarba 1) Ich habe erwähnt, dass smerge-modedie Tastenkombinationen in der Dokumentation dokumentiert sind. Vielleicht kann ich das Handbuch hier der Vollständigkeit halber zitieren. Danke für die Rückmeldung. 2) Ich bin auf v24.5, obwohl ich manchmal einen Master-Zweig ausprobiere, kann ich mich nicht erinnern, dass Smerge automatisch gedreht wurde (ist es eine neue Änderung?). 3) Das ist , weil die meisten der Zeit ich in bereits geöffneten Puffern Konflikte bekommen, wobei ich brauchen würde , um explizit einschaltensmerge-mode
Iqbal Ansari

@IqbalAnsari Gibt es einen Grund, nicht immer smerge-modeaktiviert zu sein? Vielleicht macht es nicht viel, bis es aufgerufen wird.
PythonNut

@PythonNut Gute Frage, leider habe ich keine Antwort, da ich nie versucht habe, es die ganze Zeit zu aktivieren. Es lohnt sich jedoch, es auszuprobieren
Iqbal Ansari

32

Edit: Da diese Antwort mehr positive Stimmen hat als ich erwartet hatte, habe ich sie ein wenig erweitert.

Um die Antwort durch @IqbalAnsari zu ergänzen, könnten Sie auch verwenden vc-resolve-conflicts(wie von anderen erwähnt, ist es ein Alias ​​für smerge-ediff). Dies startet die ediffSchnittstelle. Links befindet sich das erste übergeordnete Element und rechts das zweite übergeordnete Element. Sie sind auf der Modeline mit markierten MINEund OTHERjeweils. Der zusammengeführte Puffer wird unten angezeigt (siehe Screenshot).

Ein Screenshot der <code> ediff </ code> -Schnittstelle

Tastenbelegungen

  • Navigieren Sie durch die Konflikte mit nund p.
  • Akzeptiere Versionen mit aoder b.
  • Schau den Ahnen mit an /!
  • Beenden Sie die Ediff-Sitzung mit q.

Sie können auch mit zum zusammengeführten Puffer navigieren other-windowund von Hand bearbeiten, falls das Lösen eines Konflikts komplizierter ist als das Akzeptieren einer Version. Wenn Sie fertig sind, können Sie den Puffer speichern und Emacs wie gewohnt beenden. Weitere Hilfe erhalten Sie, wenn Sie diese ?während der ediffSitzung verwenden. Dort finden Sie eine ganze Reihe sehr nützlicher Befehle. Ich weiß immer noch nicht, was die Hälfte von ihnen macht!


2
Dies ist die schönste Methode IMO. Ich habe es gebunden C-x v <, obwohl ich es in der Praxis eher mit Magit aufrufen werde (wie in wvxvws Kommentar angegeben).
Phils

1
Seit dem Jahr 2000 vc-resolve-conflictist ein Alias ​​für smerge-ediff, der, wie der Name schon sagt, eine Ediff-Sitzung startet, keine Emerge-Sitzung. Übrigens ediff.elerkennt der Bibliotheksheader den emerge.elEinfluss von s an und sagt dann weiter: "Die vorliegende Version von Ediff ersetzt Emerge. Sie bietet eine überlegene Benutzeroberfläche und verfügt über zahlreiche wichtige Funktionen, die in Emerge nicht zu finden sind. Insbesondere kann sie Patches ausführen und 2-Wege und 3-Wege Dateivergleich, Zusammenführen und Verzeichnisoperationen. "
Tarsius

6
Beachten Sie auch, dass magit-ediff-resolve( Emoder eauf eine Datei mit Konflikten) smerge-ediffintern verwendet. Es hat jedoch Vorrang vor dem ediff-quit-hook, um ein etwas besseres Sitzungsende zu erzielen. Anstatt Ihnen mitzuteilen, dass Sie "den Puffer" speichern könnten (es gibt mehrere Puffer), werden Sie gefragt, ob Sie den Puffer speichern möchten (während Sie seinen Namen anzeigen).
Tarsius

Gibt es eine Möglichkeit, 4 Fenster (unsere, Eltern, deren, Arbeitsbereich) wie vimdiff anzuzeigen?
user1133275

9

Wenn Sie Spacemacs verwenden, würde ich empfehlen, den "Smerge-Transient-Modus" zu aktivieren, der ein Hydra-Menü mit allen möglichen Smerge-Befehlen anzeigt.

Rufen Sie dazu einfach Mx auf spacemacs/smerge-transient-state/body, das standardmäßig zugewiesen ist SPC-g-r.

Hier ist ein Screenshot:

Bildbeschreibung hier eingeben

Das Bearbeiten Ihrer Datei sollte dann intuitiv sein:

  1. Drücken Sie n, um zum nächsten Knoten zu gelangen.
  2. Wählen Sie eine Zusammenführungsaktion .
  3. Wiederholen, bis fertig.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.