Comment fusionner les conflits Git dans Emacs

84

Ma récente fusion de Git a engendré un grand nombre de conflits. Mon approche actuelle consiste à rechercher la prochaine occurrence de «<<<», puis à effectuer la fusion par édition de texte standard.

Question : Existe -t-il un moyen pour Emacs de prendre en charge la fusion en utilisant les informations disponibles dans Git concernant ma version, leur version et la version de base du fichier?


Éditer: Cette question a une portée différente de celle de cette question , car elle ne se limite pas à invoquer ediff.

Débutant
la source
7
Si vous utilisiez Magit, vous pourriez charger le tampon de statut, puis appuyer esur les fichiers en conflit. Magit se lancera ediffpour effectuer la fusion et vous invitera par la suite à confirmer vos modifications, puis vous pourrez organiser le fichier fusionné.
wvxvw
@ Débutant: 3 autres personnes ont pensé qu'il s'agissait d'un doublon et j'étais le dernier vote. Pourquoi: l’autre fil cité cite les mêmes réponses ( smergeet vc-resolve-conflictune autre ediff) et dure depuis plus longtemps. Je conviens que le premier fil pourrait utiliser un meilleur titre, cependant.
Dan
@Dan je ne suis pas d'accord: c'est une question différente et que les réponses sont similaires ne change pas cela.
Débutant le
1
@ IqbalAnsari: Je pense que l'autre fil a besoin d'un meilleur titre pour que les gens puissent le trouver plus facilement. En fait, je pense que le titre du fil de Beginner serait bien pour cela. Cependant, attendons un peu pour voir si les gens veulent rouvrir ce fil. Sinon, je serais en faveur de renommer le premier fil avec le titre de débutant.
Dan
1
Et pour ce que ça vaut, je pense que c'est une bonne question avec de bonnes réponses. C'est juste que je pense aussi que c'est un doublon - mais d'autres ne partageront peut-être pas cet avis (à propos du double emploi, c'est-à-dire).
Dan

Réponses:

86

Vous voudrez peut-être essayer smerge-modesimplement d'ouvrir le fichier en conflit et de le faire M-xsmerge-modeRET. Il mettra en évidence toutes les régions en conflit. Il ajoute également des raccourcis clavier pour résoudre facilement les conflits, consultez sa documentation C-hfsmerge-modeRETpour les connaître.

Préfixe par défaut

Je trouve le préfixe par défaut pour smerge-mode C-c^fastidieux, donc je l'ai changé pour C-cv

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

Liens importants

Pour moi, les reliures les plus importantes sont:

smerge-nextlié à smerge-command-prefixnpasser au conflit suivant.

smerge-previouslié à smerge-command-prefixppasser au conflit précédent.

smerge-keep-currentlié à smerge-command-prefixRETconserver la version sur laquelle se trouve le curseur.

smerge-keep-mineobligé de smerge-command-prefixmgarder vos changements.

smerge-keep-otherlié à smerge-command-prefixogarder d'autres changements.

smerge-ediffobligé de smerge-command-prefixEdémarrer une session ediff pour fusionner les conflits. C'est la même chose que vc-resolve-conflicts(merci @phils et @Malabarba pour l'avoir signalé).

Activation automatique du mode smerge

MISE À JOUR: Les éléments suivants ne concernent que les versions Emacs antérieures . Ils 25.1peuvent entraîner des problèmes pour les versions ultérieures, voir https://github.com/magit/magit/issues/3897.

De plus, vous pouvez être intéressé par l'activation automatique smerge-modelors de la visite d'un fichier / tampon avec des marqueurs de conflit, vous pouvez utiliser quelque chose comme ce qui suit pour y parvenir

(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)

Notez que j'utilise buffer-list-update-hooket pas find-file-hookdepuis la plupart du temps j'obtiens des conflits dans un tampon qui est déjà ouvert dans emacs, auquel cas ce find-file-hookn'est d'aucune aide.

Vérifiez également les autres méthodes mentionnées dans cette réponse.

Iqbal Ansari
la source
1
(1) N'oubliez pas smerge-ediff. (2) Quelle est la version d'Emacs? Sur la branche emacs master actuelle, smerge s’active automatiquement. (3) Pourquoi utilisez-vous buffer-list-update-hookau lieu de find-file-hook?
Malabarba
Pour plus de précisions, notez que smerge-ediffet vc-resolve-conflictssont la même chose.
phils
@Malabarba 1) J'ai mentionné que smerge-modeles liaisons de clé sont documentées dans sa documentation. Je peux peut-être citer le manuel ici pour l'exhaustivité. Merci pour les commentaires. 2) Je suis sur la v24.5, bien que j'essaie parfois de master branch, je ne me souviens pas que smerge soit automatiquement activé (s'agit-il d'un changement récent?). 3) C'est parce que la plupart du temps, j'ai des conflits dans des mémoires tampons déjà ouvertes, auquel cas je devrais activer explicitementsmerge-mode
Iqbal Ansari
@IqbalAnsari y a-t-il une raison pour ne pas l'avoir smerge-modeactivé tout le temps? Peut-être que ça ne fait pas grand chose avant d'être invoqué
PythonNut
@PythonNut Bonne question, malheureusement, je n'ai pas de réponse, car je n'ai jamais essayé de la garder activée tout le temps, cela en vaut la peine d'essayer
Iqbal Ansari
32

Edit: cette réponse ayant reçu plus de votes positifs que prévu, je l’ai développée un peu.

Pour compléter la réponse par @IqbalAnsari, vous pouvez également utiliser vc-resolve-conflicts(comme mentionné par d'autres, il s'agit d'un alias smerge-ediff). Cela va démarrer l' ediffinterface. À gauche, le premier parent fusionné et le second parent fusionné à droite. Ils sont étiquetés sur le modeline avec MINEet OTHERrespectivement. Le tampon fusionné est présenté ci-dessous (voir capture d'écran).

Une capture d'écran de l'interface <code> ediff </ code>

Raccourcis clavier

  • Naviguez dans les conflits avec net p.
  • Accepter les versions avec aou b.
  • Regardez l'ancêtre avec /!
  • Quittez la session ediff avec q.

Vous pouvez également accéder à la mémoire tampon fusionnée avec other-windowet modifier manuellement si la résolution d'un conflit est plus compliquée que d'accepter une version. Lorsque vous avez terminé, vous pouvez enregistrer le tampon et quitter Emacs comme d'habitude. Pour plus d’aide, utilisez-le simplement ?pendant la ediffsession, il contient toute une série de commandes très utiles. Je ne sais toujours pas ce que font la moitié d'entre eux!

Suvayu
la source
2
C’est la plus belle méthode à l’OMI. Je le suis lié à C-x v <, bien que dans la pratique je suis plus susceptible de l'invoquer avec Magit (selon le commentaire de wvxvw).
phils
1
Depuis l'an 2000, vc-resolve-conflictc'est un alias pour smerge-ediffqui, comme son nom l'indique, démarre une session Ediff, pas une session Emerge. Soit dit en passant, l’en-tête de la bibliothèque ediff.elreconnaît l’ emerge.elinfluence de s, puis poursuit en disant "La version actuelle d’Ediff remplace Emerge. Elle fournit une interface utilisateur supérieure et possède de nombreuses fonctionnalités principales qui n’existaient pas dans Emerge. En particulier, elle permet de corriger Comparaison de fichiers à 2 et 3 voies, fusion et opérations de répertoire. "
Tarsius
6
Notez également que magit-ediff-resolve( Emou esur un fichier avec des conflits) utilise en smerge-ediffinterne. Toutefois, il est ediff-quit-hookpréférable de ne pas fournir une expérience de finition de session légèrement meilleure. Au lieu de vous dire que vous pouvez enregistrer "le tampon" (il existe plusieurs tampons), il vous demande si vous souhaitez enregistrer le tampon (tout en vous indiquant son nom).
Tarsius
Est-il possible d'afficher 4 fenêtres (la nôtre, le parent, le leur, leur espace de travail) comme vimdiff?
user1133275
9

Si vous utilisez Spacemacs, je vous recommanderais d'activer le "smerge-transitient-mode", qui ouvre un menu hydra avec toutes les commandes smerge possibles.

Pour ce faire, appelez simplement Mx spacemacs/smerge-transient-state/body, qui est attribué par défaut à SPC-g-r.

Voici une capture d'écran:

entrez la description de l'image ici

La modification de votre fichier devrait alors être intuitive:

  1. Appuyez sur npour aller au prochain morceau.
  2. Choisissez une action de fusion .
  3. Répéter jusqu'à la fin.
Dangom
la source