Existe-t-il un moyen de «prendre les deux» lorsque vous utilisez Vim comme outil de fusion?

11

J'utilise également Vim comme une fusion à 3 voies avec Git et j'ai parfois besoin de prendre des modifications à la fois des succursales locales et distantes. kdiff3peut le faire avec quelques pressions de touches, existe-t-il un moyen de le faire dans Vim?

synapse
la source

Réponses:

6

Pas exactement ce que vous avez demandé, mais peut trouver cela utile: Plugin Splice: un plugin Vim pour résoudre les conflits lors d'une fusion à trois . Il a un joli screencast de démonstration sur Vimeo .

Si vous allez vous en tenir au vimdiff par défaut, vous pouvez créer une fonction pour récupérer le numéro de tampon pour les fenêtres environnantes et les utiliser pour appeler :diffgetdeux fois:

                            *:diffg* *:diffget*
:[range]diffg[et] [bufspec]
        Modify the current buffer to undo difference with another
        buffer.  If [bufspec] is given, that buffer is used.  If
        [bufspec] refers to the current buffer then nothing happens.
        Otherwise this only works if there is one other buffer in diff

(...)

The [bufspec] argument above can be a buffer number, a pattern for a buffer
name or a part of a buffer name.  Examples:

    :diffget        Use the other buffer which is in diff mode
    :diffget 3      Use buffer 3
    :diffget v2     Use the buffer which matches "v2" and is in
                diff mode (e.g., "file.c.v2")

Vous pouvez les utiliser à l'aide d'un mappage pour affecter un appel à cette fonction aux touches dans lesquelles vous avez été utilisé kdiff3.

Vous pouvez trouver plus d'informations sur ce vimcast .

mMontu
la source
3

yank et put peuvent fonctionner sans plugins ni fonctions supplémentaires, même si c'est peut-être un peu moins pratique que dgoudp

Copiez simplement les bits nécessaires à partir des tampons parents et collez-les au bon endroit dans le tampon fusionné. Ceci est également utile si vous voulez juste une partie d'un bloc de diff plutôt que le tout.

Il se peut que vous deviez parfois forcer Vim à mettre à jour la mise en évidence des différences avec :diffupdate.

8bittree
la source
1

Pour combiner les modifications des branches cible et de fusion en une seule commande:

Vous pouvez simplement supprimer les lignes avec des marqueurs de conflit Git. Les deux méthodes suivantes supprimeront toutes les lignes commençant par:

<<<<<<<
=======
>>>>>>>

Méthode 1: entrée et exécution manuelles d'une commande

:g/^<\{7}\|^|\{7}\|^=\{7}\|^>\{7}/d

Méthode 2: implémentation d'une commande définie par l'utilisateur

"Delete all Git conflict markers
"Creates the command :GremoveConflictMarkers
function! RemoveConflictMarkers() range
  echom a:firstline.'-'.a:lastline
  execute a:firstline.','.a:lastline . ' g/^<\{7}\|^|\{7}\|^=\{7}\|^>\{7}/d'
endfunction
"-range=% default is whole file
command! -range=% GremoveConflictMarkers <line1>,<line2>call RemoveConflictMarkers()

Vim diffget et diffput ne choisiront qu'une branche ou l'autre. Donc, la seule vraie solution autre que celle donnée ci-dessus est de tirer manuellement et de coller des deux fichiers dans la copie de travail.

user3751385
la source
Donnez une raison si vous allez voter contre.
user3751385
C'est tout ce que je fais - il suffit de supprimer les marqueurs.
Aaron McMillin