Ver todos los `git diffs` con vimdiff

210

Configuré git diffpara envolver en vimdiff, usando " Git Diff with Vimdiff " como guía, y funciona como se esperaba a menos que haya muchos archivos con cambios.

Cuando hay varios archivos con cambios y ejecuto git diff, abre el primer archivo y, después de salir de la primera instancia de vimdiff, me aparece el siguiente mensaje:

external diff died, stopping at filename

Este es un comportamiento completamente diferente al que estoy acostumbrado. Tuve una configuración similar en el pasado con SVN y, al diferenciarme de varios archivos, revisaría el primer archivo, luego escribiría y dejaría de usar :wqy se abriría el siguiente archivo con diferencias.

Este no es el caso con Git. Lo intenté :n[ext], pero hacerlo no llena la ventana izquierda con el archivo original, por lo que puede diferenciarse con la versión modificada.

chuckg
fuente

Respuestas:

338
git config --global diff.tool vimdiff
git config --global difftool.prompt false
git config --global alias.d difftool

Al escribir se git dobtiene el comportamiento esperado, al escribir :wqciclos vim en el siguiente archivo del conjunto de cambios.

chuckg
fuente
22
Solo mis dos centavos: me he dfalias diffy dtalias difftool. Además, al escribir :qaen Vim se pasará al siguiente conjunto de cambios sin guardar nada.
JC Yamokoski
2
Esta solución es excelente, excepto que al guardar los cambios debe escribir ": w!" en lugar de: w
Asenar
2
@jonyamo La configuración del alias siempre debe basarse en la frecuencia con la que usamos algunos comandos. A menudo estoy usando git diffque git difftool. Así que me he alias da 'diff' y 'dt' to difftool '. La usabilidad es más importante que crear alias con patrones.
Habeeb Perwad
¿Cómo hacer que "git diff" use vimdiff ?, esta respuesta me hace usar un alias. Si alias "diff" no funciona.
Rombus
66
@Asenar "Esta solución es excelente, excepto que al guardar los cambios hay que escribir en :w!lugar de :w". Eso es porque git llama vimdiffcon la -Ropción. Puedes anularlo con git config --global difftool.vimdiff.cmd 'vimdiff "$LOCAL" "$REMOTE"'. Eso abrirá vimdiff en modo de escritura.
wisbucky
103

Puedes intentarlo git difftool, está diseñado para hacer estas cosas.

Primero, necesitas configurar la herramienta diff para vimdiff

git config diff.tool vimdiff

Luego, cuando quiera diferenciar, simplemente use en git difftoollugar de git diff. Funcionará como esperabas.

czchen
fuente
1
¡Casi ahí! Modificado un poco, es exactamente lo que estoy buscando. ¡+1 sin embargo!
chuckg
1
La herramienta de combinación vimdiff se ha actualizado recientemente: git.kernel.org/?p=git/… (y algunas otras confirmaciones, pero esa es la más importante). No estoy seguro de cuándo será la próxima versión de mantenimiento, pero si está dispuesto a construir desde git.git, ¡las actualizaciones serán suyas!
Cascabel
21
Git accepts kdiff3, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge,
and opendiff as valid diff tools. You can also set up a custom tool. 

git config --global diff.tool vimdiff
git config --global diff.tool kdiff3
git config --global diff.tool meld
git config --global diff.tool xxdiff
git config --global diff.tool emerge
git config --global diff.tool gvimdiff
git config --global diff.tool ecmerge
Nanhe Kumar
fuente
3
Respondes por mergetool, no por difftool. Pero sigue siendo una respuesta útil. +1.
dotancohen
@dotancohen Realmente, gracias. Nunca me di cuenta de que, por tonto error, ahora puedo editar mi respuesta.
Nanhe Kumar
1
@NanheKumar, @dotancohen, reemplazar mergecon difflas respuestas anteriores hará el truco, es decir git config --global diff.tool vimdiff .
Will
2

Para las personas que desean usar otra herramienta de diferencias que no figura en git, digamos con nvim. Esto es lo que terminé usando:

git config --global alias.d difftool -x <tool name>

En mi caso, me puse <tool name>a nvim -de invocar el comando diff con

git d <file>
pez gato salado
fuente