vimdiff et fusionner les conflits

14

Lors de la fusion de branches sous contrôle de source, il y a souvent le problème d'un conflit de fusion avec d'autres développeurs.

Je sais que nous pouvons utiliser vimdiff pour différencier les modifications de code par rapport au contrôle de code source , mais existe-t-il également un moyen d'utiliser vimdiff pour aider à résoudre les conflits de conflits de fusion.

Personnellement, je suis plus intéressé par git mais il serait utile de comprendre s'il existe des plugins / techniques pour d'autres outils / systèmes de contrôle de source.

Martin York
la source
Avez-vous déjà essayé Meld ?
Eric Sabelhaus
1
@EricSabelhaus: Est-ce mieux que vimdiff pour résoudre les conflits? Ce site consiste à poser / répondre à des questions sur vim.
Martin York
Cela dépend du cas d'utilisation, je suppose. Si je travaille sur du code qui vit à distance, j'utiliserai très certainement vimdiff. Si je travaille localement sur ma machine de développement, j'utiliserai Meld, car il fournit une interface utilisateur riche en fonctionnalités pour aider le développeur à effectuer des fusions complexes à 3 voies.
Eric Sabelhaus
1
@EricSabelhaus: Pour moi, le terme feature rich UIest trompeur; vimdiff peut ne pas avoir une belle interface utilisateur, il est certainement riche en fonctionnalités. Je trouve également vim un environnement beaucoup plus productif que tous les éditeurs GUI que j'ai utilisés (mais je l'utilise depuis longtemps et c'était une courbe d'apprentissage abrupte). Je suis plus curieux de savoir si Meld fait quelque chose que vim ne fait pas, ce qui en valait la peine.
Martin York
Je ne peux pas dire spécifiquement s'il a un ensemble de fonctionnalités plus robuste, mais il est définitivement dans le même domaine que vimdiff.
Eric Sabelhaus

Réponses:

18

J'utilise normalement git sur la ligne de commande.

Mais quand il y a un conflit de fusion, j'utilise Vim pour les résoudre (personnellement, je le fais avec le plugin fugitif). Remarque: fugitif est bon pour beaucoup de manipulations de git depuis Vim. Ma fonctionnalité préférée est la différence à 3 voies d'un conflit de fusion.

git prend cela en charge dans vimdiff via git mergetool. J'ai installé fugitive mais vous pouvez le configurer manuellement (merci @ Jay Thompson).

Configuration manuelle:

git config --global merge.tool vimdiff
git mergetool <file with conflicts>

La sortie est légèrement différente de ce qui est décrit ci-dessous (je ne l'ai pas personnellement utilisé). Mais le principe est le même mais vous avez une quatrième fenêtre en bas contenant le résultat.

entrez la description de l'image ici

Configurer avec Fugitive

vim-fugitive est un plugin git wrapper / intégration pour Vim; il peut faire beaucoup de choses, et la résolution des conflits en fait partie.

<Install the Fugitive Plugin>
vim <file with conflicts>
:Gdiff
  1. Vue 2 (à gauche): le code qui était sur votre succursale.
  2. Vue 1 (milieu): le code fusionné (avec conflits)
  3. Vue 3 (à droite): le code qui a été fusionné dans votre code.

Vous pouvez maintenant extraire et récupérer le texte des deux autres vues dans la vue centrale (qui va contenir toutes les corrections manuelles). Une fois que vous avez résolu tous les conflits manuellement, quittez simplement vimdiff

entrez la description de l'image ici

Bien que vous puissiez utiliser :diffget <view number>et :diffput <view number>pour tirer et pousser des choses entre les vues. Personnellement, je ne trouve pas cela très utile. Tout le code est déjà dans la vue du milieu. Donc j'aime juste éditer cette vue manuellement jusqu'à ce que le conflit soit résolu. Être capable de voir les deux versions du code de chaque côté de la fenêtre de mon éditeur est cependant extrêmement utile.

Aussi une très bonne démo de son utilisation ici

Martin York
la source
1
Si vous ne souhaitez pas utiliser ou installer Fugitive pour une raison quelconque, vous pouvez également simplement définir git config --global merge.tool vimdiffpuis exécuter git mergetoolpour démarrer vim en mode diff.
Jay Thompson
Est-ce que cela prend en charge le style "diff3" des conflits de fusion, où les "ancêtres communs fusionnés" sont affichés?
alxndr
@alxndr: Je n'avais jamais entendu parler de diff3 auparavant. Mais après un rapide google. La sortie d'un conflit de fusion dans git (et tout autre contrôle de source que j'ai utilisé) est identique à a diff3 -E. Les images ci-dessus sont donc générées à partir de fichiers contenant ces marqueurs.
Martin York
Maintenant que je regarde de près, la première capture d'écran montre le style de fusion diff3; le volet supérieur du milieu "BASE" est l'ancêtre commun, dont les volets gauche et droit divergeaient.
alxndr
1
Il est important de se rappeler que chacune de ces 4 vues n'est qu'un tampon. Cela signifie que vous pouvez ouvrir un autre onglet (ou même rester dans la même fenêtre) et choisir uniquement les tampons que vous souhaitez consulter à un moment donné. Il n'y a aucune raison de garder les 4 fenêtres ouvertes en même temps si vous ne les utilisez pas toutes.
Cody Poll