es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Salida de git diff con líneas de separación incorrectas.

Estoy escribiendo un script que se basa en la salida de “git diff” y en los números de línea que se muestran allí. Sin embargo, me encontré con un caso en el que git muestra misteriosamente la salida en un formato incorrecto, en mi humilde opinión.

El caso problemático (diferencia en GitHub en la web)

El problema en cuestión se encuentra en este fragmento (diferencia en GitHub) (ver imagen a continuación):

enter image description here

También puedes ver el bloque de código en el commit padre y el commit actual.

El caso problemático (git diff)

Sin embargo, al ejecutar “git diff –word-diff “, obtendrás la siguiente salida (solo muestro el fragmento en cuestión):

@@ -77,2 +80,4 @@ public class CofVGenRoeMetz {
                        phi[i] = [-Gaussian.Phi((u[0]-]{+gauss.cumulativeProbability((u[0]+} + x[i])
                                        / Math.sqrt(scale20))
                                        * [-Gaussian.Phi((u[1]-]{+gauss.cumulativeProbability((u[1]+} + x[i])
                                                        / Math.sqrt(scale21));

Problema

Según la diferencia de git, se puede interpretar que “/ Math.sqrt(scale20))” pertenece a la línea 78 (antes) / 81 (después), lo cual solo es cierto para el escenario “después”. ¿Por qué obtengo la salida incorrecta?

En otras palabras, según la salida de git, se puede inferir que “/ Math.sqrt(scale20))” pertenece a la línea 78 antes de que ocurra este commit (esto se basa en la sintaxis de “git diff”). Sin embargo, en realidad, si observas el archivo en el commit padre, “/ Math.sqrt(scale20))” pertenece a la línea 77.

PS: Estoy usando MacOS Monterey.

El comando completo de “git diff” que utilicé:
git diff --no-color --unified=0 --word-diff --ignore-submodules --ignore-all-space 3424dae cfdd0dfd1b7724efbc786d0cfc070dc0696435b4 -- imrmc/mrmc_source/src/simroemetz/core/CofVGenRoeMetz.java

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución

    El problema radica en la opción --word-diff utilizada en el comando git diff. Esta opción hace que git diff muestre solo las palabras modificadas en lugar de líneas completas. Por lo tanto, en la salida, git diff intenta mostrar la ubicación exacta del cambio dividiendo las líneas en fragmentos más pequeños. Esto causa la confusión en la numeración de líneas que se ve en la diferencia de GitHub en la web.

    Para resolver este problema, deberíamos usar la opción --color-words en lugar de --word-diff. Esta opción muestra las palabras modificadas en color y mantiene la numeración de líneas original. Por lo tanto, el comando debería ser:

    git diff --no-color --unified=0 --color-words --ignore-submodules --ignore-all-space 3424dae cfdd0dfd1b7724efbc786d0cfc070dc0696435b4 -- imrmc/mrmc_source/src/simroemetz/core/CofVGenRoeMetz.java

    Con este comando, podemos ver claramente que / Math.sqrt(scale20)) pertenece a la línea 77 tanto en el commit padre como en el commit actual.

    Nota: El problema no está relacionado con el sistema operativo que se está utilizando.

Comments are closed.