Digamos que obtengo un parche creado con git format-patch
. El archivo es básicamente un diff unificado con algunos metadatos. Si abro el archivo en Vim, puedo ver qué líneas se han modificado, pero no puedo ver qué caracteres difieren en las líneas cambiadas. ¿Alguien sabe una manera (en Vim, o algún otro software gratuito que se ejecuta en Ubuntu) para visualizar las diferencias por carácter?
Un ejemplo de contador donde se visualiza la diferencia por carácter es cuando se ejecuta vimdiff a b
.
actualizar vie 12 nov 22:36:23 UTC 2010
diffpatch es útil para el escenario en el que está trabajando con un solo archivo.
actualizar jue 16 jun 17:56:10 UTC 2016
Echa un vistazo a diff-highlight en git 2.9 . Este script hace exactamente lo que estaba buscando originalmente.
git diff --color-words
es muy útil para ver qué palabras tienen cambios dentro de las líneas, en lugar de la salida unificada habitual. Sin embargo, está basado en palabras en lugar de en caracteres, por lo que si no hay mucho espacio en blanco en el contenido que está diferenciando, la salida puede ser menos ordenada. (Editado: Vaya, veo que entendí mal lo que estás pidiendo, sin embargo, tal vez este comentario sería útil para alguien.)Respuestas:
Dadas sus referencias a Vim en la pregunta, no estoy seguro de si esta es la respuesta que desea :) pero Emacs puede hacerlo. Abra el archivo que contiene el diff, asegúrese de que usted está en
diff-mode
(si el archivo se llamafoo.diff
ofoo.patch
esto se produce automáticamente, de lo contrario escriba M-xdiff-mode
RET), ir al trozo que le interesa y golpear C-c C-barefine-hunk
. O recorra el archivo un trozo a la vez con M-n; eso hará el refinamiento automáticamente.fuente
git log master.. -p | emacs -
M-!
para ejecutar el comando y capturar la salida en un búfer.En git, puedes fusionarte sin comprometerte. Combine su parche primero, luego haga:
Tenga en cuenta el punto después del signo igual.
fuente
git diff --color-words=.
.git diff --color-words=.
ygit diff --color-words .
funciona de manera diferente. Es mejorgit diff --color-words .
.git diff --color-words .
es realmente lo mismo quegit diff --color-words -- .
! Es decir, el.
se interpreta como un camino. Puedes verificar conmkdir x y; echo foo > x/test; git add x/test; git commit -m test; echo boo > x/test; cd y; git diff --color-words=.; git diff --color-words .; git diff --color-words -- .
.Aquí están algunas versiones con salida de menos ruidoso que
git diff --word-diff-regex=<re>
y que requieren menos de tipificación, pero son equivalentes a,git diff --color-words --word-diff-regex=<re>
.Simple (resalta los cambios de espacio):
Simple (resalta los cambios de caracteres individuales; no resalta los cambios de espacio):
Más complejo (resalta los cambios de espacio):
En general:
donde
<re>
es una expresión regular que define "palabras" con el propósito de identificar cambios.Estos son menos ruidosos en el sentido de que colorean las "palabras" cambiadas, mientras que el uso de solo
--word-diff-regex=<re>
"palabras" combina con-/+
marcadores de colores .fuente
--color-words
, sin la=.
parte.git diff --color-words='\w'
funcionaría mejor con diacríticos (git v1.7.10.4)--word-diff=plain
a tener adicionalmente[-
y-]
deleciones de sonido envolvente y{+
y+}
adiciones de sonido envolvente. Sin embargo, como advierte el manual, las ocurrencias reales de estos delimitadores en la fuente no se escapan de ninguna maneraLa expresión regular anterior ( de Thomas Rast ) hace un trabajo decente al separar fragmentos de diferencias en el nivel de puntuación / carácter (sin ser tan ruidoso como
--word-diff-regex=.
).Publiqué una captura de pantalla de la salida resultante aquí .
Actualizar:
Este artículo tiene algunas sugerencias geniales. Específicamente, el
contrib/
árbol del repositorio de git tiene unadiff-highlight
secuencia de comandos perl que muestra resaltados finos.Inicio rápido para usarlo:
fuente
--color-words=[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
'
al principio del valor allí. De lo contrario, recibí un error. Además, simplemente usando--color-words
obtengo exactamente el mismo comportamiento que usar esa expresión regular.foo.bar
afoo.qux
usted verá la diferencia.git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
./usr/local/share/git-core/contrib/diff-highlight/diff-highlight
. Esto parece sugerir que el git de Homebrew instala toda la contribución en/usr/local/share/git-core/contrib/
. Finalmente, lo siguiente funcionó para mígit diff --color=always | /usr/local/share/git-core/contrib/diff-highlight/diff-highlight
Si no tiene nada contra la instalación de NodeJS, hay un paquete llamado "diff-so-fancy" ( https://github.com/so-fancy/diff-so-fancy ), que es muy fácil de instalar y funciona perfectamente:
Editar: Me acabo de enterar de que en realidad es un contenedor para el diferencial de resaltado oficial ... Al menos es más fácil de instalar para perlophobes como yo y la página de GitHub está bien documentada :)
fuente
No conozco la herramienta de diferencia por carácter, pero hay una herramienta de diferencia por palabra: wdiff.
consulte ejemplos Las 4 herramientas de diferencia de archivos principales en UNIX / Linux: Diff, Colordiff, Wdiff, Vimdiff .
fuente
wdiff old_file new_file | cdiff
*vimdiff
, luego dentro de vim:windo wincmd K
para cambiar al diseño de ventana vertical (uno debajo del otro) uno al lado del otro. Ese diseño es mucho mejor para archivos con líneas largas.wdiff2
,mdiff
y la herramienta en línea de Google .Después de un poco de investigación, noté que esta pregunta apareció dos veces recientemente en la lista de correo principal de Vim. El complemento NrrwRgn se mencionó en ambas ocasiones (haga dos regiones estrechas y difúndalas). Usar NrrwRgn como lo describe Christian Brabandt se siente más como una solución que como una solución, pero tal vez eso sea lo suficientemente bueno.
Probé NrrwRgn y, junto con: diffthis, fue realmente útil para ilustrar las diferencias por carácter dentro de partes de un solo archivo. Pero tomó muchas teclas. Mi Vimscript está bastante oxidado, pero probablemente podría tener un script. Tal vez NrrwRgn podría mejorarse para proporcionar la funcionalidad deseada.
Pensamientos?
fuente