git - trucos - ¿Cómo puedo visualizar las diferencias por personaje en un archivo unificado de diferencias?
git ver archivos modificados (7)
(Comentarios convertidos a una respuesta por solicitud)
Versiones con salida menos ruidosa que git diff --word-diff-regex=<re>
y que requieren menos tipeo 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" con el fin de identificar cambios.
Estos son menos ruidosos ya que colorean las "palabras" modificadas, mientras que el uso de --word-diff-regex=<re>
rodea las "palabras" combinadas con marcadores de colores -/+
.
Digamos que recibí un parche creado con el 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. ¿Alguien sabe una forma (en Vim, u otro software libre que se ejecuta en Ubuntu) para visualizar las diferencias por personaje?
Un ejemplo de contador donde se visualiza la diferencia por carácter es cuando se ejecuta vimdiff ab
.
actualización vie 12 de noviembre 22:36:23 UTC 2010
diffpatch es útil para el escenario donde trabajas con un solo archivo.
actualización 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.
Dadas tus referencias a Vim en la pregunta, no estoy seguro de si esta es la respuesta que quieres :) 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 Mx diff-mode
RET ), vaya al trozo que le interese y pulsa Cc Cb para refine-hunk
. O recorra el archivo un trozo a la vez con Mn ; eso hará la refinación automáticamente.
Después de investigar un poco, me doy cuenta de que esta pregunta ha aparecido dos veces recientemente en la lista principal de correo de Vim. El complemento NrrwRgn se mencionó en both times ( crea dos regiones estrechas y las diferencia). Usar NrrwRgn como lo describe Christian Brabandt parece más una solución alternativa que una solución, pero quizás sea suficiente.
Probé NrrwRgn y, junto con: diffthis, fue de hecho útil para ilustrar las diferencias por personaje dentro de partes de un solo archivo. Pero tomó muchas teclas. My Vimscript está bastante oxidado, pero probablemente podría estar escrito. Tal vez NrrwRgn podría mejorarse para proporcionar la funcionalidad deseada.
¿Pensamientos?
En git, puedes fusionar sin cometer. Combina tu parche primero, luego hazlo:
git diff --word-diff-regex=.
Tenga en cuenta el punto después del signo igual.
No estoy al tanto de la herramienta de diferencia de caracteres, pero hay una herramienta de diferencia por palabra: wdiff.
consulte ejemplos Top 4 Herramientas de diferencia de archivos en UNIX / Linux - Diff, Colordiff, Wdiff, Vimdiff .
Si no tiene 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
Editar: Acabo de descubrir que en realidad es un contenedor para el diff-highlight oficial ... Al menos es más fácil de instalar para perlophobes como yo y la página de GitHub está muy bien documentada :)
git diff --color-words="[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+"
La expresión regular anterior ( de Thomas Rast ) hace un trabajo decente de 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 here .
Actualizar:
Este artículo tiene algunas buenas sugerencias. Específicamente, el contrib/
tree del git repo tiene un script de perl diff-highlight
que muestra reflejos de grano fino.
Inicio rápido para usarlo:
$ 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