Je viens de fusionner une branche dans mon master dans git et j'ai Automatic merge failed; fix conflicts and then commit the result.
maintenant j'ai couru git mergetool
et vimdiff s'est 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?
159
Réponses:
Les quatre tampons fournissent une vue différente du même fichier. Le tampon en haut à gauche (LOCAL) correspond à l'apparence du fichier dans votre branche cible (dans laquelle vous fusionnez). Le tampon en haut à droite (REMOTE) correspond à l'apparence du fichier 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é l'une de l'autre).
Je me trompe peut-être 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 doubles à simples, et REMOTE a effectué le même changement mais a également changé la valeur d'arrière-plan d'une couleur à une URL. (Je pense que la fusion n'est pas assez intelligente pour remarquer que toutes les modifications apportées à LOCAL sont également présentes dans REMOTE; il sait juste que LOCAL a apporté des modifications depuis BASE aux mêmes endroits que REMOTE).
Dans tous les cas, le tampon du bas contient le fichier que vous pouvez réellement éditer - celui qui se trouve dans votre répertoire de travail. Vous pouvez apporter les modifications que vous souhaitez;
vim
vous montre en quoi il diffère de chacune des vues de dessus, qui sont les zones que la fusion automatique ne pouvait pas gérer. Tirez les modifications de LOCAL si vous ne voulez pas les modifications REMOTE. Tirez les modifications de REMOTE si vous préférez celles-ci aux modifications LOCALES. Tirez de BASE si vous pensez que REMOTE et LOCAL sont faux. Faites quelque chose de complètement différent si vous avez une meilleure idée! En fin de compte, les modifications que vous apportez ici sont celles qui seront réellement validées.la source
:x
ou:w
(:x
sort aussi) plus «retour».vim
.La réponse de @ chepner est excellente, je voudrais ajouter quelques détails sur la partie "comment dois-je procéder pour résoudre le conflit de fusion" de la question. Si vous regardez comment utiliser réellement vimdiff dans ce cas, cela va ci-dessous.
Tout d'abord, pour aborder l'option «tout abandonner» - si vous ne voulez pas utiliser «vimdiff» et que vous voulez abandonner la fusion: appuyez sur Esc, puis tapez
:qa!
et appuyez sur Enter. (voir aussi Comment quitter l'éditeur Vim? ). Git vous demandera si la fusion est terminée, répondez avecn
.Si vous souhaitez utiliser vimdiff, voici quelques raccourcis utiles. Cela suppose que vous connaissez les bases de Vim (navigation et insertion / mode normal):
:diffget LO
:diffget RE
:diffget BA
:wqa
:cquit
plutôt avec : Comment annuler un git diff externe?Il ne semble pas possible d'ajouter des segments de conflit locaux et distants sans copier-coller ni raccourcis personnalisés: /vi/10534/is-there-a-way-to-take-both- lors de l'utilisation de vim-as-merge-tool, ce qui est dommage car add add est un type de conflit si courant.
Pour éviter que vimdiff ne vous demande d'appuyer sur Entrée à chaque démarrage, ajoutez à votre
.vimrc
:comme mentionné sur: /vi/771/how-can-i-suppress-the-press-enter-prompt-when-opening-files-in-diff-mode
Vous pouvez rechercher sur Internet d'autres raccourcis vimdiff. J'ai trouvé celui-ci utile: https://gist.github.com/hyamamoto/7783966
la source
:diffget
.L'outil de fusion ultime pour remplacer vimdiff
C'est une sorte de ironie, mais c'est ce vers quoi j'ai fini par converger en tant que vimmer après avoir essayé vimdiff.
Pour résoudre un conflit de fusion, j'ai presque toujours besoin de voir:
pour ensuite essayer de les mettre ensemble.
Alors que vimdiff affiche BASE, LOCAL et REMOTE à l'écran:
Je ne sais pas comment faire pour montrer clairement ces deux différences dont j'ai besoin en plus de regarder droite gauche droite gauche plusieurs fois.
De plus, LOCAL et REMOTE sont déjà visibles dans les marqueurs de conflit git merge, donc je ne gagne pas grand-chose à un outil qui les montre à nouveau.
Par conséquent, j'ai plutôt créé mon propre petit "difftool" qui montre en fait les diffs qui me manquaient:
~ / bin / cirosantilli-mergetool
GitHub en amont .
Et installez-le avec:
Maintenant, quand vous faites:
il montre les deux diffs que je veux sur le terminal, par exemple quelque chose le long:
Vous pouvez donc voir ici les deux diffs vidés dans le terminal:
RealView_BASE_15560.py
contreRealView_LOCAL_15560.py
RealView_BASE_15560.py
contreRealView_REMOTE_15560.py
Si les diffs sont gros, je vais juste chercher avec mes superpuissances tmux .
Oui, vous perdez certains raccourcis fournis par vimdiff, mais en général, la résolution des conflits nécessite un copier-coller soigneux des deux versions, ce que je peux faire très bien dans une session vim normale avec les marqueurs de conflit git.
Observation et comparaison de fichiers pendant l'
vimdiff
exécutionAvant de
cirosantilli-mergetool
m'asseoir et d'automatiser ma configuration parfaite avec , c'est ce que je faisais pour obtenir les deux différences dont j'avais besoin.Pendant l'
git mergetool
exécutionvimdiff
, s'il y a un conflit sur un fichier nommé, disonsmain.py
, git génère des fichiers pour chacune des versions, nommés comme:dans le même répertoire que
main.py
où se1367
trouve le PID de git mergetool, et donc un entier "aléatoire", comme mentionné à: Dans un conflit de fusion git, quels sont les fichiers BACKUP, BASE, LOCAL et REMOTE générés?Donc, pour voir les diffs que je veux, je trouve d'abord les fichiers générés avec
git status
, puis j'ouvre de nouveaux terminaux et je fais un vimdiff entre les paires de fichiers qui me tiennent à cœur:Ensemble
git mergetool
, ces informations aident BEAUCOUP à comprendre ce qui se passe rapidement!De plus, même lorsque mergetool est en cours d'exécution, vous pouvez simplement ouvrir le fichier:
directement et éditez-le ici si vous pensez que ce sera plus facile avec une fenêtre d'éditeur plus grande.
Aller directement à fusionner les conflits
Alors que les
]c
sauts au prochain point de diff dans vimdiff, il n'y a pas toujours de conflit de fusion.Pour vous aider, j'ai dans mon
~/.vimrc
:qui trouve directement les conflits.
git imerge
Peut-être que la meilleure option est simplement de renoncer à utiliser vimdiff et de s'appuyer sur vim + git imerge régulier qui a été mentionné à: Comment puis-je savoir quels commits Git provoquent des conflits? puisque la courbe d'apprentissage de vimdiff est ennuyeuse et qu'elle ne fait pas les fonctions dont nous avons le plus besoin.
la source