2013-02-15 1 views
97

Je viens de fusionner une branche dans mon maître en git et j'ai obtenu Automatic merge failed; fix conflicts and then commit the result. Maintenant, j'ai couru git mergetool et vimdiff ouvert avec l'image ci-dessous. Je ne sais pas comment utiliser vimdiff. Que signifie chaque panneau ici et comment dois-je procéder pour résoudre le conflit de fusion?Comment utiliser vimdiff pour résoudre un conflit?

enter image description here

+2

Voir [cette page] (http://vim.wikia.com/wiki/A_better_Vimdiff_Git_mergetool). Si c'est ce que vous voulez dire par "correct", l'état actuel de votre code est en haut à gauche. – romainl

+0

@romainl Je suis encore confus après avoir lu cela, quels sont les raccourcis et comment puis-je choisir quel fichier utiliser comme branche principale? –

+2

@Danny [http://www.rosipov.com/blog/use-vimdiff-as-git-mergetool/](http://www.rosipov.com/blog/use-vimdiff-as-git-mergetool/) est un bon. –

Répondre

100

Les quatre tampons offrent une vue différente du même fichier. Le tampon en haut à gauche (LOCAL) est la façon dont le fichier a été regardé dans votre branche cible (ce que vous fusionnez). Le tampon supérieur droit (REMOTE) est la façon dont le fichier a été regardé dans votre branche source (d'où vous fusionnez). Le tampon du milieu (BASE) est l'ancêtre commun des deux (vous pouvez donc comparer comment les versions gauche et droite ont divergé les unes des autres).

Je peux me tromper sur le point suivant. Je pense que la source du conflit de fusion est que les deux fichiers ont changé la même partie du fichier depuis 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 également présents dans REMOTE, il sait juste que LOCAL a fait des changements depuis BASE dans les mêmes endroits que REMOTE).

Dans tous les cas, le tampon inférieur contient le fichier que vous pouvez réellement modifier — celui qui se trouve dans votre répertoire de travail. Vous pouvez faire les changements que vous aimez; vim vous montre comment il diffère de chacune des vues supérieures, qui sont les zones que la fusion automatique ne pouvait pas gérer. Tirez les changements de LOCAL si vous ne voulez pas les changements REMOTE. Tirez les modifications de REMOTE si vous préférez celles-ci aux changements LOCAUX. Tirez sur BASE si vous pensez que REMOTE et LOCAL sont incorrects. Faites quelque chose de complètement différent si vous avez une meilleure idée! En fin de compte, les changements que vous faites ici sont ceux qui seront réellement commis.

+2

Question rapide comment puis-je sauvegarder dans vim? –

+3

': x' ou': w' (': x' se termine aussi) plus 'return'. –

+4

Anders: il existe d'autres outils de fusion que vous pouvez utiliser si vous ne savez pas comment utiliser 'vim'. – chepner

9

@ la réponse de chepner est géniale, je voudrais ajouter quelques détails sur "comment devrais-je procéder pour résoudre le conflit de fusion" partie de la question. Si vous regardez comment utiliser réellement vimdiff dans ce cas, il va ci-dessous.


D'abord, pour faire face aux « abandonner tout » l'option - si vous ne voulez pas utiliser « vimdiff » et que vous voulez annuler la fusion: appuyez sur Echap , puis tapez :qa! et cliquez Entrez. (voir également How to exit the Vim editor?). Git vous demandera alors si la fusion est terminée, répondez par n.


Si vous souhaitez utiliser vimdiff, voici quelques raccourcis utiles.Cela suppose que vous savez bases de vim (navigation et insert/mode normal):

  • naviguer vers le tampon de fond (fusion résultat): Ctrl-Wj
  • naviguer à la différence suivante avec j/k; ou, mieux, utiliser ]c et [c pour naviguer diff suivant et précédent respectivement
  • utilisation zo pendant un pli pour l'ouvrir, si vous voulez voir plus contexte
  • pour chaque diff, selon la réponse de @ chepner, vous pouvez obtenir la version de code à partir local, version distante ou une base, ou le modifier et refaire comme bon vous semble
    • t o obtenir la version locale, utilisez :diffget LO
    • de distance: :diffget RE
    • de la base: :diffget BA
    • ou, si vous voulez vous modifier, obtenir une version de la première locale/distante/base, puis aller à mode d'insertion et de modifier le reste
  • une fois fait, enregistrez le résultat de la fusion et fermez toutes les fenêtres :wqa
  • normalement, git détecte que la fusion a été effectuée et complète la fusion commit

Vous pouvez rechercher sur Internet d'autres raccourcis vimdiff. J'ai trouvé celui-ci utile par exemple: https://gist.github.com/hyamamoto/7783966

+0

Cela devrait être upvoted x1000 fois et accepté comme une meilleure réponse. –

Questions connexes