¿Qué significa "@@ -1 +1 @@" en la salida de diff de Git?

He estado recostackndo datos de la información devuelta

git diff <commitId>..<commitId> 

y me encontré con @@ -1 +1 @@

No puedo entender lo que eso me dice. He buscado un poco en Google, pero fue en vano.

Es un identificador de trozo de diferencias unificado. Esto está documentado por GNU Diffutils.

El formatting de salida unificado comienza con un encabezado de dos líneas, que se ve así:

 --- from-file from-file-modification-time
 +++ to-file to-file-modification-time

La timestamp se ve como 2002-02-21 23:30:39.942229878 -0800 para indicar la date, la hora con fracciones de segundos y la zona horaria. Los segundos fraccionarios se omiten en hosts que no admiten sellos de time fraccionarios.

Puede cambiar el contenido del encabezado con la opción --label=label ; ver Ver Nombres Alternos .

Luego vienen uno o más trozos de diferencias; cada trozo muestra un área donde difieren los files. Los trozos de formatting unificado se ven así:

 @@ from-file-line-numbers to-file-line-numbers @@
  line-from-either-file
  line-from-either-file ...

Si un trozo contiene solo una línea, solo aparece su número de línea de inicio. De lo contrario, sus numbers de línea se ven como start , count . Se considera que un trozo vacío comienza en la línea que sigue al trozo.

Si un hunk y su context contienen dos o más líneas, sus numbers de línea se ven como start , count . De lo contrario, solo aparece su número de línea final. Se considera que un trozo vacío termina en la línea que precede al trozo.

Las líneas comunes a ambos files comienzan con un carácter de espacio. Las líneas que realmente difieren entre los dos files tienen uno de los siguientes caracteres indicadores en la columna de printing izquierda:

  • +
    Aquí se agregó una línea al primer file.

  • Aquí se eliminó una línea del primer file.

Simple ejemplo de análisis

El formatting es básicamente el mismo diff -u diff unificado.

Por ejemplo:

 diff -u <(seq -w 16) <(seq -w 16 | grep -Ev '^(02|03|14|15)$') 

Aquí eliminamos las líneas 2, 3, 14 y 15. Salida:

 @@ -1,6 +1,4 @@ 01 -02 -03 04 05 06 @@ -11,6 +9,4 @@ 11 12 13 -14 -15 16 

@@ -1,6 +1,4 @@ significa:

  • -1,6 : esta pieza corresponde a la línea 1 a 6 del primer file:

     01 02 03 04 05 06 

    - significa "viejo", ya que usualmente lo invocamos como diff -u old new .

  • +1,4 dice que esta pieza corresponde a la línea 1 a 4 del segundo file.

    + significa "nuevo".

    ¡Solo tenemos 4 líneas en lugar de 6 porque se eliminaron 2 líneas! El nuevo galán es simplemente:

     01 04 05 06 

@@ -11,6 +9,4 @@ para el segundo trozo es análogo:

  • en el file anterior, tenemos 6 líneas, comenzando en la línea 11 del file anterior:

     11 12 13 14 15 16 
  • en el nuevo file, tenemos 4 líneas, comenzando en la línea 9 del nuevo file:

     11 12 13 16 

    Tenga en count que la línea 11 es la novena línea del nuevo file porque ya hemos eliminado 2 líneas del trozo anterior: 2 y 3.

Encabezado Hunk

Dependiendo de su versión y configuration de git, también puede get una línea de código junto a la línea @@ , por ejemplo, el func1() { en:

 @@ -4,7 +4,6 @@ func1() { 

Esto también se puede get con el indicador -p de diff simple.

Ejemplo: file antiguo:

 func1() { 1; 2; 3; 4; 5; 6; 7; 8; 9; } 

Si eliminamos la línea 6 , la diferencia muestra:

 @@ -4,7 +4,6 @@ func1() { 3; 4; 5; - 6; 7; 8; 9; 

Tenga en count que esta no es la línea correcta para func1 : saltó las líneas 1 y 2 .

Esta impresionante característica a menudo dice exactamente a qué function o class pertenece cada trozo, lo cual es muy útil para interpretar la diferencia.

La forma en que el algorithm para elegir el encabezado funciona exactamente se trata en: ¿De dónde viene el extracto en el encabezado git diff hunk?

Es la información actual del range trozo que indica en qué numbers de línea se inicia y finaliza este trozo.

Lea http://en.wikipedia.org/wiki/Diff#Unified_format para get una explicación detallada.