Comment puis-je utiliser vimdiff pour résoudre un conflit?
j'ai juste fusionné une branche dans mon maître en git et j'ai eu Automatic merge failed; fix conflicts and then commit the result.
maintenant J'ai couru git mergetool
et vimdiff a ouvert avec l'image ci-dessous. Je ne sais pas me servir de vimdiff. Que signifie Chaque panel ici et comment dois-je procéder pour régler le conflit de fusion?
2 réponses
les quatre tampons offrent une vue différente du même fichier. Le buffer en haut à gauche (LOCAL) est l'apparence du fichier dans votre branche cible (ce dans quoi vous fusionnez). Le buffer en haut à droite (REMOTE) est l'apparence du fichier dans votre branche source (d'où vous fusionnez). Le tampon du milieu (BASE) est l'ancêtre commun des deux (donc vous pouvez comparer comment les versions de gauche et de droite ont divergé l'une de l'autre).
je peux me tromper sur le point suivant. Je pensez que la source du conflit de fusion est que les deux fichiers ont changé la même partie du fichier depuis la BASE; LOCAL a changé les guillemets de double à simple, et REMOTE a fait le même changement, mais a également changé la valeur de fond d'une couleur à une URL. (Je pense que la fusion n'est pas assez intelligente pour remarquer que tous les changements de LOCAL sont aussi présents dans REMOTE; il sait juste que LOCAL a fait des changements depuis BASE aux mêmes endroits que REMOTE a).
dans tous les cas, le tampon du bas contient le fichier que vous pouvez éditer-celui qui se trouve dans votre répertoire de travail. Vous pouvez faire tous les changements que vous voulez; vim
vous montre comment il diffère de chacune des vues du haut, qui sont les domaines que la fusion automatique ne pourrait pas gérer. Si vous ne voulez pas que la télécommande change, vous pouvez tirer les modifications depuis la section locale. Pull changes from REMOTE si vous préférez les changements locaux. Tirer de la BASE si vous pensez à la fois distant et LOCAL sont faux. Faire quelque chose de complètement différent si vous avez une meilleure idée! En fin de compte, les changements que vous apportez ici sont ceux qui seront effectivement engagés.
la réponse de @chepner est excellente, je voudrais ajouter quelques détails sur "Comment dois-je procéder pour corriger le conflit de fusion" partie de la question. Si vous regardez comment utiliser vimdiff dans ce cas, il va ci-dessous.
tout d'abord, pour aborder l'option" avorter tout "- si vous ne voulez pas utiliser" vimdiff "et que vous voulez avorter la fusion: appuyez sur Esc , puis tapez :qa!
et appuyez sur Enter . (voir aussi Comment quitter l'éditeur Vim? ). Git vous demandera alors si merge a été complète, répondre avec n
.
si vous voulez utiliser vimdiff, voici quelques raccourcis utiles. Cela suppose que vous connaissez les bases de Vim (navigation et insertion / mode normal):
- accédez à la partie inférieure de la mémoire tampon (résultat de la fusion): Ctrl-W j
- naviguer à la prochaine diff avec j / k ; ou, mieux, utiliser ] c et [ c pour naviguer vers suivant et précédent diff respectivement
- utiliser z o , alors que sur un pli pour l'ouvrir, si vous voulez voir plus de contexte
- pour chaque diff, selon la réponse de @chepner, vous pouvez soit obtenir la version du code à partir de la version locale, distante ou de base, ou l'éditer et la refaire comme bon vous semble.
- pour l'obtenir de la version locale, utilisez
:diffget LO
- de la télécommande:
:diffget RE
- de la base:
:diffget BA
- ou, si vous voulez éditer vous-même, obtenir une version à partir de local/remote/base d'abord, puis aller en mode insertion et éditer le reste
- pour l'obtenir de la version locale, utilisez
- une fois fait, enregistrer le résultat de la fusion, et quitter toutes les fenêtres
:wqa
- normalement, git détecte que la fusion a été faite et complète la commit de fusion
vous pouvez rechercher D'autres raccourcis vimdiff sur Internet. J'ai trouvé celui-ci utile par exemple: https://gist.github.com/hyamamoto/7783966