¿Cómo puedo visualizar las diferencias por carácter en un archivo diff unificado?


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 en las líneas cambiadas difieren. ¿Alguien conoce una manera (en Vim, o algún otro software libre que se ejecuta en Ubuntu) de 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.

Actualización Vie Nov 12 22:36: 23 UTC 2010

Diffpatch es útil para el escenario en el que está trabajando con un solo archivo.

Actualización Jue Jun 16 17: 56: 10 UTC 2016

Echa un vistazo a resaltado de diferencias en git 2.9. Este script hace exactamente lo que estaba buscando originalmente.

Author: Community, 2010-07-12

7 answers

Dadas sus referencias a Vim en la pregunta, no estoy seguro de si esta es la respuesta que desea :) pero Emacs puede hacer esto. Abra el archivo que contiene el diff, asegúrese de que está en diff-mode (si el archivo se llama foo.diff o foo.patch esto sucede automáticamente; de lo contrario escriba M-x diff-mode RET), ve al pedazo que te interesa y pulsa C-c C-b para refine-hunk. O paso a través del archivo un trozo a la vez con M-n; eso hará el refinamiento automáticamente.

 12
Author: legoscia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-14 14:40:46

En git, puedes fusionar sin confirmar. Fusionar el parche primero, luego hacer:

git diff --word-diff-regex=.

Observe el punto después del signo igual.

 134
Author: yingted,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-13 02:59:42

(Comentarios convertidos en una respuesta por solicitud)

Versiones con menos salida ruidosa que git diff --word-diff-regex=<re> y que requieren menos escritura que, pero son equivalentes a, git diff --color-words --word-diff-regex=<re>.

Simple (resalta los cambios de espacio):

git diff --color-words

Simple (resalta los cambios de caracteres individuales; no resalta los cambios de espacio):

git diff --color-words=.

Más complejo (resalta los cambios de espacio):

git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'

En general:

git diff --color-words=<re>

Donde <re> es una expresión regular que define "palabras" para el propósito de identificar cambios.

Estos son menos ruidosos ya que colorean las "palabras" cambiadas, mientras que usando solo --word-diff-regex=<re> rodea las "palabras" emparejadas con marcadores de color -/+.

 101
Author: ntc2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-03 15:40:27
git diff --color-words="[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+"

La expresión regular anterior (de Thomas Rast) hace un trabajo decente al separar fragmentos de diferencias a nivel de puntuación/carácter (sin ser tan ruidoso como --word-diff-regex=.).

He publicado una captura de pantalla de la salida resultante aquí.


Actualización:

Este artículo tiene algunas grandes sugerencias. Específicamente, el árbol contrib/ del repositorio de git tiene un script perl diff-highlight que muestra resaltados de grano fino.

Inicio rápido de uso it:

$ curl https://git.kernel.org/cgit/git/git.git/plain/contrib/diff-highlight/diff-highlight > diff-highlight
$ chmod u+x diff-highlight
$ git diff --color=always HEAD~10 | diff-highlight | less -R
 41
Author: Justin M. Keyes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-28 01:23:51

Si no tienes nada en contra de instalar 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:

npm install -g diff-so-fancy
git diff --color | diff-so-fancy | less -R

Edit: Acabo de descubrir que en realidad es un envoltorio para el resaltado de diferencias oficial... Al menos es más fácil de instalar para perlófobos como yo y la página de GitHub está bien documentada:)

 4
Author: walnutz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-06 01:48:19

No soy consciente de la herramienta de diferencia por carácter, pero hay una herramienta de diferencia por palabra: wdiff.

Consulte ejemplos Las 4 mejores herramientas de diferencias de archivos en UNIX / Linux: Diff, Colordiff, Wdiff, Vimdiff.

 3
Author: thegeek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-13 08:05:46

Después de un poco de investigación, noto que esta pregunta ha surgido dos veces recientemente en la lista de correo principal de Vim. El complemento NrrwRgn fue mencionado ambos times (haz dos regiones estrechas y diffícalas). Usar NrrwRgn como lo describe Christian Brabandt se siente más como una solución alternativa que como una solución, pero tal vez eso sea lo suficientemente bueno.

Probé NrrwRgn y, junto con: diffthis, fue de hecho útil para ilustrar las diferencias por carácter dentro de partes de un en fila india. Pero tomó muchas pulsaciones de teclado. Mi Vimscript está bastante oxidado, pero probablemente podría estar escrito. Tal vez NrrwRgn podría ser mejorado para proporcionar la funcionalidad deseada.

Pensamientos?

 1
Author: Adam Monsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-13 03:58:04