¿Por qué git mergetool se abre el 4 de windows en vimdiff?(Me gustaría esperar 3)

StackOverflow https://stackoverflow.com/questions/7309707

  •  26-10-2019
  •  | 
  •  

Pregunta

Cuando conocí a un conflicto, traté de usar git-mergetool para resolver.He escrito:

>git mergetool -t vimdiff

Abrió vimdiff en 4 direcciones, no de 3 vías.Mi división de windows en vimdiff aspecto:

:ls
  1 #a   "Gemfile.lock"                 line 1
  2 %a   "Gemfile.lock.LOCAL.4828.lock" line 1
  3  a   "Gemfile.lock.BASE.4828.lock"  line 0
  4  a   "Gemfile.lock.REMOTE.4828.lock" line 0

¿Qué son?Quiero un 3-way diff:archivo de destino, de combinación de archivos y archivo de trabajo.¿Cómo debo configurar mi git o vimdiff?

¿Fue útil?

Solución

Como alternativa, ¿has pensado en usar fugitivo?

No te voy a mentir; fugitive.vim puede ser el mejor envoltorio Git de todos los tiempos.

Hay un excelente vimcast, Fugitive.vim - Resolución de conflictos de fusión con Vimdiff, por Drew Neil. Esto es parte de una serie sobre Fugitive.

los Vimcasts El sitio web es un buen lugar para obtener más información sobre VIM.

Para usar Fugitive como usted, puede usar lo siguiente.

git config --global mergetool.fugitive.cmd 'vim -f -c "Gdiff" "$MERGED"'
git config --global merge.tool fugitive

Nota: es posible que desee cambiar vim a mvim o gvim.

Fugitive tiene mucho más que ofrecer que solo ser un script de herramienta de fusión, así que asegúrese de leer la documentación y/o consulte los vimcasts.

Otros consejos

Después de una gran cantidad de investigación para emitir Mergetool con Vimdiff y solo 3 Windows, se me ocurrió esta configuración, eso me permite elegir cuando quiero 3 Windows o las 4 Windows predeterminadas:

git config --global merge.tool vimdiff
git config --global alias.mt mergetool

git config --global mergetool.merge3.cmd 'vim -d -c "wincmd l" "$LOCAL" "$MERGED" "$REMOTE"'
git config --global alias.m3 'mergetool -t merge3'

Ahora puede iniciar 3 Windows simplemente escribiendo:

git m3

Y el valor predeterminado (4 ventanas) seguirá funcionando como se esperaba con:

git mt

Además, probablemente le gustaría agregar estas líneas al final de su ~/.vimrc o /etc/vim/vimrc

 " shortcuts to vimdiff
 let mapleader=','
 let g:mapleader=','

 if &diff
    map <leader>1 :diffget LOCAL<CR>
    map <leader>2 :diffget BASE<CR>
    map <leader>3 :diffget REMOTE<CR>
 endif

Esto creará atajos como ,1 para agarrar de la izquierda, ,3 para agarrar de la derecha (en ambos modos) y también ,2 Para agarrar desde la base (ventana central) en el modo 4 Windows.

¡Eso ayuda mucho!

Mi ~/.gitconfig El archivo se ve así:

[user]
        name = Dr Beco
        email = my@email
[merge]
        tool = vimdiff
[mergetool "merge3"]
        cmd = vim -d -c \"wincmd l\" \"$LOCAL\" \"$MERGED\" \"$REMOTE\"
[alias]
        lo = log --pretty=format:\"%h %ce %cd %s\" --graph
        co = checkout
        ci = commit
        cm = commit -a -m
        st = status
        br = branch
        m3 = mergetool -t merge3
        mt = mergetool
[diff]
        tool = vimdiff

Espero que esto te ayude (y aquellos que llegan aquí).

Modificando un poco los comandos de esta página:

git config --global mergetool.vimdiff3.cmd 'vim -f -d "$LOCAL" "$MERGED" "$REMOTE"'
git config --global merge.tool vimdiff3
  • 'Fusionado' sería su copia de trabajo.
  • 'Local' el archivo que se encuentra en la rama que está tratando de hacer los cambios
  • 'Remoto' el archivo de la rama con el que está tratando de fusionarse.

Y luego ejecuta el comando: git mergetool.

Nota: Yo suelo fugitivo también y lo recomiendo encarecidamente.

Nota:mientras que usted puede utilizar sólo 3 de Windows como se describe en Dr Beco's respuesta
(vim -d -c "wincmd l" "$LOCAL" "$MERGED" "$REMOTE"'),
4-el modo de windows es mejorado con git 2.8 (Marzo de 2016)

Ver cometer 2300328 (29 de enero de 2016) por Dickson Wong (diwo).
(Fusionado por Junio C Hamano -- gitster -- en cometer 82c17b7, 17 de Febrero de 2016)

El vimdiff backend para "git mergetool"se ha ajustado a organizar y el número de buffers en el orden en que se correspondería con la expectativa de la mayoría de las personas que leen de izquierda a derecha y de arriba hacia abajo y asignar los búferes 1 2 3 4 "mentalmente" a la base local de mezcla remoto basado en windows en ese orden.

Internamente, git ahora uso:

"$merge_tool_path" -f -d -c '4wincmd w | wincmd J' \
            "$LOCAL" "$BASE" "$REMOTE" "$MERGED"

en lugar de:

"$merge_tool_path" -f -d -c 'wincmd J' \
        "$MERGED" "$LOCAL" "$BASE" "$REMOTE"

mergetool:reordenar vim/gvim buffers en los diffs

Cuando se invoca por defecto (g)vimdiff mezcla de tres vías, el archivo combinado es se carga como el primer tampón, pero se trasladó a la parte inferior de la cuarta ventana.
Esto provoca una desconexión entre vim los comandos que operan en la ventana posiciones (por ejemplo, CTRL-W_w) y aquellos que operan en el búfer de índice (por ejemplo, ¿/dp).

Este cambio reordena los búferes de tener el mismo índice de windows, mientras que mantener el cursor predeterminado para el resultado de la combinación como la parte inferior de la ventana.

Secundaré la recomendación fugitiva.

También podrías probar empalme.vim. Es un complemento VIM diseñado para actuar como un reemplazo Git o Mercurial Mergetool Drop-In. Le permite barajar fácilmente varias vistas del conflicto. También es muy rápido, directo y hace un buen trabajo para hacer que la fusión sea más intuitiva. Aquí está un screencast.

Los archivos que enumeró son:

  1. El archivo local que contiene el conflicto.
  2. El archivo en la rama se está fusionando.
  3. El archivo en la rama del que se fusiona.
  4. El archivo como estaba en ambas ramas del nodo Ancesestor. ¡Este archivo es muy útil para descubrir qué está pasando!

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top