¿Cómo debo usar git diff para líneas largas?


235

Estoy ejecutando git-diff en un archivo, pero el cambio está al final de una larga línea.

Si uso las teclas del cursor para moverme hacia la derecha, pierde la codificación de colores, y peor aún, las líneas no se alinean, lo que dificulta el seguimiento del cambio.

¿Hay alguna manera de evitar ese problema o simplemente hacer que las líneas se envuelvan?

Estoy ejecutando Git 1.5.5 a través de mingw32.


66
Es posible que desee probar 'git diff --color-words', no resuelve el problema de desplazamiento, ¡pero los cambios de palabras están rodeados de contexto en una sola línea!
kevinf

77
Usar "doblar" parece funcionar bastante bien:git diff --color-words | fold
Amy

@ Amy, he intentado usar foldpero elimina el color. Como especificas --color-words, supongo que lograste pasar colores a fold. ¿Cómo?
Nero gris

Respuestas:


120

La visualización de la salida de git diffes manejada por cualquier localizador que esté utilizando.

Comúnmente, bajo Linux, lessse usaría.

Puede decirle a git que use un buscapersonas diferente configurando la GIT_PAGERvariable de entorno. Si no le importa la paginación (por ejemplo, su terminal le permite desplazarse hacia atrás), puede intentar configurar explícitamente GIT_PAGERque se vacíe para detenerlo con un buscapersonas. Bajo Linux:

$ GIT_PAGER='' git diff

Sin un buscapersonas, las líneas se ajustarán.

Si su terminal no admite salida de color, también puede desactivarlo utilizando el --no-colorargumento o colocando una entrada en la sección de color de su archivo de configuración de git.

$ GIT_PAGER='' git diff --no-color

1
Puedo confirmar que establecer GIT_PAGER en blanco hace que las líneas se ajusten. También inserta símbolos que hacen que sea un poco difícil de leer, pero si es necesario puedo encontrar un localizador diferente, por lo que sigue siendo una respuesta válida. :) Gracias.
Peter Boughton

1
¿Qué símbolos agrega que dificultan la lectura? También podría editar mi respuesta para resolver ese problema.
SpoonMeiser

Principalmente "<- [m" para cada nueva línea (donde <- era un solo carácter de flecha), pero también marcadores donde (creo) que cada color habría comenzado, como "<- [1m" y "<- [32m".
Peter Boughton

1
¿Ayuda el argumento --no-color? No estoy seguro acerca de los personajes de nueva línea.
SpoonMeiser 01 de

Sí, gracias, eso evita que aparezca todo el contenido no deseado, por lo que los de nueva línea también deben haber estado relacionados con el color.
Peter Boughton

229

O si usa menos como buscapersonas predeterminado, simplemente escriba -Smientras visualiza la diferencia para volver a habilitar el ajuste en menos.


6060
consejo relacionado, úselo --word-diffpara ver un resaltado codificado por colores de palabras cambiadas
Josh Diehl

55
solo una nota para esto, ya que vi que algunas personas tenían problemas con él, -S es diferente de -s (asegúrese de
presionar

2
@JoshDiehl: Espero que no te importe ... Creo que la --word-diffparte merece tener su propia respuesta sobre esto, ya que me parece que estoy haciendo mucho para ayudar a resolver el problema subyacente: descubrir qué ha cambiado en una larga fila. Entonces, lo hice uno: stackoverflow.com/a/19253759/313756
lindes

1
Nota: esto no parece funcionar en OS X (disidentes).
DilithiumMatrix

@zhermes Me funciona en Mavericks, con menos 418. Asegúrate de que estás escribiendo -Scon una S mayúscula, no -s. Menos muestra un mensaje "Doblar líneas largas (presione RETORNO)" en la parte inferior después de escribir -S, y luego presionar Volver habilita el ajuste.
Rory O'Kane

115

También puede usar git configpara configurar el buscapersonas para envolver.

$ git config core.pager 'less -r' 

Establece la configuración del localizador para el proyecto actual.

$ git config --global core.pager 'less -r' 

Establece el localizador globalmente para todos los proyectos.


3
con msysgit (1.8.1.msysgit.1) funcionó para mí usando comillas dobles -git config --global core.pager "less -r"
kerim

Esto me hizo envolver permanentemente con git diff en OS X. ¡Gracias!
Thomson Comer

Funciona, pero no entiendo por qué. Alguien puede explicar? man less, -rno dice nada sobre envolver.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

@ThomsonComer '-r' se refiere a mostrar caracteres de control en OS X ... ¿Cómo conseguiste que esto funcionara?
DilithiumMatrix

No puedo recordar con seguridad ahora. Pero encontrado algunos enlaces que explican más: michael.otacoo.com/linux-2/avoid-escape-characters-in-git superuser.com/questions/366930/... unix.stackexchange.com/questions/19317/...
Shoan

49

Con todo el crédito a Josh Diehl en un comentario a esta respuesta , sin embargo, siento que esta debería ser una respuesta en sí misma, por lo que lo agrego:

Una forma de tratar de ver las diferencias en las líneas largas es usar un diff orientado a palabras. Esto se puede hacer con:

git diff --word-diff

En este caso, obtendrá una salida diff significativamente diferente, que le muestra específicamente lo que ha cambiado dentro de una línea.

Por ejemplo, en lugar de obtener algo como esto:

diff --git a/test-file.txt b/test-file.txt
index 19e6adf..eb6bb81 100644
--- a/test-file.txt
+++ b/test-file.txt
@@ -1 +1 @@
-this is a short line
+this is a slightly longer line

Puede obtener algo como esto:

diff --git a/test-file.txt b/test-file.txt
index 19e6adf..eb6bb81 100644
--- a/test-file.txt
+++ b/test-file.txt
@@ -1 +1 @@
this is a [-short-]{+slightly longer+} line

O, con la coloración, en lugar de esto:

resultado de solo <code> git diff </code>

Puede obtener esto:

resultado de <code> git diff --word-diff </code>

Ahora, si está comparando una línea realmente larga, aún puede tener problemas con la situación del localizador que describió originalmente y que se ha abordado, aparentemente con satisfacción, en otras respuestas. Con suerte, esto le brinda una nueva herramienta, sin embargo, para identificar más fácilmente lo que ha cambiado en la línea.


66
Hay un par de opciones para --word-diff: color, plain, y porcelain. Además, se puede cambiar la expresión regular para los límites de palabras con --word-diff-regex. El valor predeterminado parece ser \S+. ( v2.1.1 )
Michael - ¿Dónde está Clay Shirky?

3
--color-wordsparece ser una forma abreviada --word-diff=color, lo cual es bueno cuando solo estás viendo el diff, no compartiéndolo.
CivFan

Ah, esto es interesante y potencialmente muy útil. ¡Gracias por compartir!
Darragh Enright

1
Me gusta --word-diff=porcelainmás que --word-diffporque porcelainalineará los cambios en líneas separadas, mientras que --word-diffcoloca los cambios en línea. Las líneas separadas le permiten ver las diferencias más fácilmente cuando las diferencias son sutiles.
wisbucky

1
¡Cambio de vida para archivos LaTeX!
6005

30

Para usar menos como localizador y hacer que el ajuste de línea sea permanente, simplemente puede habilitar la opción de plegar líneas largas:

git config --global core.pager 'less -+S'

De esta manera, no tiene que escribirlo mientras usa menos.

Salud


Me funcionó en OS X 10.9.5. ¡Gracias!
Jay Taylor el

Del mismo modo, si desea DESACTIVAR el ajuste de línea al leer Git diffs, la configuración es similar:git config --global core.pager 'less -S
Topher Hunt

19

Solo busqué en Google este. GIT_PAGER='less -r'funciona para mi


99
Aún mejor (para mí): less -R(En realidad, yo uso less -eiFRSX, que también resuelve los problemas de color y
ajuste de

2
less -R es como -r, pero solo las secuencias de escape de "color" ANSI salen en forma "en bruto". A diferencia de -r, la apariencia de la pantalla se mantiene correctamente en la mayoría de los casos. (hombre menos)
richk

19

Mac OSX: Ninguna de las otras respuestas, excepto la '-S' de alguien45 mientras menos se está ejecutando, funcionó para mí. Se necesitó lo siguiente para hacer que el ajuste de texto sea persistente:

git config --global core.pager 'less -+$LESS -FRX'

Esto también funcionó para mí, pero no entiendo por qué. ¿Qué está -+$LESShaciendo el parámetro? A menos que git lo defina, mi variable de entorno MENOS ni siquiera está configurada.
jakar

3
@jakar: entonces no hace nada. En algunos entornos, $LESSse establece en algún valor (p. Ej. Por a .logino a .profileo algo), y esa opción, creo, solo agrega los valores predeterminados y luego los agrega -FRX.
naught101

Esto no funcionó para mí en OS X Mavericks, $LESSno está definido.
DilithiumMatrix

naught101 es correcto que + - $ LESS simplemente incluye cualquier configuración que esté en .login o .profile (si corresponde). Me está funcionando bien en Mavericks, pero puedes omitirlo si causa problemas.
John Lemberger



5

Cuando usa "git diff" y muestra varias páginas (ve ":" al final de la página) en este caso puede escribir "-S" y presionar enter (S debe ser mayúscula). alternará las líneas largas y plegadas.


esto es mucho más fácil que tener que meterse con ninguna configuración
chharvey

4

Nadie señaló esto hasta ahora. Es bastante simple de recordar y no es necesario realizar ninguna configuración adicional en la configuración de git

git diff --color | less -R

Con mucho, la más simple de todas las respuestas en esta página. Mi entorno: Oracle Linux 7.6. git diff --color | less -FRpara pequeños cambios cuando no es necesario desplazarse
Rakesh N

3

Simplemente podría canalizar la salida de git diff a más:

git diff | more

3

No es una solución perfecta, pero gitky git-guipuede mostrar tanto esta información, y tienen barras de desplazamiento.


1

enumere la configuración actual / predeterminada:

  $ git config --global core.pager  
    less -FXRS -x2

luego actualice y omita el -S como:

  $ git config --global core.pager 'less -FXR -x2'

the -S: hace que las líneas más largas que el ancho de la pantalla se corten en lugar de doblarse.


-1

Cuando tengo problemas, a menudo recurro a DiffMerge. Excelente herramienta de diferencias que tiene resaltado de diferencias en línea. Además, en las últimas versiones agregaron un modo para tener un modo horizontal.

Sin embargo, no he podido configurar git para usarlo. Así que tengo que buscar para obtener primero las dos versiones del archivo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.