git diff con líneas intercaladas

Quiero un diff con líneas intercaladas, es decir, con "hunks" no más de una línea.

Por ejemplo, en lugar de

-t1 = "Christmas 2013" -t2 = "Easter 2013" -t3 = "Thanksgiving 2013" +t1 = "Christmas 2014" +t2 = "Easter 2014" +t3 = "Thanksgiving 2014" 

Quiero esto:

 -t1 = "Christmas 2013" +t1 = "Christmas 2014" -t2 = "Easter 2013" +t2 = "Easter 2014" -t3 = "Thanksgiving 2013" +t3 = "Thanksgiving 2014" 

Hasta ahora tengo

 git diff -U0 --ignore-space-at-eol before after holidays.ini 

Intenté configurar --break-rewrites=0%/0% , --break-rewrites=100%/0% y así sucesivamente, pero no cambió nada (ni siquiera sé si es relevante para mi problema) .

Ninguno de los algorithms de diff incorporados se comportará de esta manera.

Tengo curiosidad sobre lo que te gustaría ver si, por ejemplo, el cambio consistiera en agregar una línea y replace otras dos, de modo que (para captar tu ejemplo) tuvieras algo como esto:

 -t1 = "Christmas 2013" +t1 = "Christmas 2014" +t2 = "Easter 2014" -t3 = "Thanksgiving 2013" +t3 = "Thanksgiving 2014" 

Aquí, para t2 , no hay nada que eliminar.

En cualquier caso, creo que tu mejor opción es postprocesar la salida de git diff -U0 .

Si está en un sistema Unix-ish, también puede usar diff original, no unificado, por ejemplo:

 $ diff --git a/like_min.py b/like_min.py index 05b9a4d..1c90084 100644 --- a/like_min.py +++ b/like_min.py @@ -1 +1 @@ -def like_min(iterable, key=None): +def like_min(iterable, key=None): # comment @@ -9 +9 @@ def like_min(iterable, key=None): - for candidate in it: + for candidate in it: # another comment $ git show HEAD:like_min.py | diff - like_min.py 1c1 < def like_min(iterable, key=None): --- > def like_min(iterable, key=None): # comment 9c9 < for candidate in it: --- > for candidate in it: # another comment 

que podría ser más fácil de postprocesar (dependiendo de muchos detalles). En particular, cada cambio comienza con un número de línea y un código de letra ( a dd, c jage, d elete), por lo que no hay necesidad de averiguar si algo es un puro-agregar o eliminar-puro, frente a los cambios que le gustaría dividir en una sola línea a la vez. Todavía podría tener que convertir un "cambio" en un "cambio seguido de agregar o eliminar" si el nuevo número de líneas no coincide:

 $ git show HEAD:like_min.py | diff - like_min.py 1c1,2 < def like_min(iterable, key=None): --- > def like_min(iterable, key=None): # comment > def like_min(iterable, key=None): # comment 9c10 < for candidate in it: --- > for candidate in it: # another comment 

Además, "old diff" puede tener diferentes (y no las deseadas) opciones de ignorar espacios en blanco.


--break-rewrites con --break-rewrites es ortogonal a lo que desea: simplemente cambia el punto en el que git considera que un file es "completamente reescrito", y muestra así el cambio como "eliminar todo el contenido anterior del file, insert contenido nuevo" .

El punto de corte pnetworkingeterminado es, según la documentation, -B50%/60% , que especifica que no se puede "reescribir" más del 60% del file, o equivalentemente, "al less el 40% del file aún coincide". Es posible que desee disminuir esto, pero probablemente no desee boostlo. (Por cierto, parece que no puedo establecer esto en 0%; establecerlo en 1% hace que la mayoría de los cambios se conviertan en reescrituras completas, pero pequeños cambios, como cambiar solo una línea de un file, aún aparecen como pequeños cambios en lugar de totales- reescrituras de files. Esto se debe probablemente a que el índice de similitud no se basa únicamente en los cambios de línea a la vez, sino que también incluye las coincidencias dentro de la línea).

(Ese primer número, el 50% en -B50%/60% es el valor de índice de similitud utilizado para la detección de cambio de nombre, suponiendo que la detección de cambio de nombre está habilitada. Piense en los dos numbers como los valores de "similitud e índice de similitud": el índice de similitud es "qué tan cerca está el file 1 del file 2", y la falta de similitud es solo el 100% less la similitud).

Si no se requiere que el diff sea textual, podrías usar KDiff3 :

Captura de pantalla de KDiff3

Esto dará una granularidad aún mayor que las líneas individuales.