¿Qué significa “@@ -1 +1 @@” en la salida de diferencias de Git?

103

He estado recopilando datos de la información devuelta por

git diff <commitId>..<commitId>

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

No puedo entender lo que me está diciendo. He buscado un poco en Google pero fue en vano.

SSEMember
fuente
¿Puede describir qué archivo da como resultado tal encabezado?
kworr
@kworr esa es una pregunta tonta, cualquier diferencia en formato unificado tiene encabezados de rango.
Yuval Adam
@YuvalAdam: en realidad el formato unificado diff tiene más campos que deberían ser llenados como [- +] <posición>, <líneas> y aquí no se muestran cambios, pero estos cambios tocan la primera línea del archivo.
kworr

Respuestas:

69

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

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

--- desde-archivo-desde-archivo-hora-de-modificación 
+++ a-archivo-a-archivo-hora-modificación

La marca de tiempo parece 2002-02-21 23:30:39.942229878 -0800indicar la fecha, la hora con fracciones de segundo y la zona horaria. Los segundos fraccionarios se omiten en hosts que no admiten marcas de tiempo fraccionarias.

Puede cambiar el contenido del encabezado con la --label=labelopción; consulte Ver nombres alternativos .

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

@@ desde-archivo-números-de-línea-a-archivo-números -de-línea
  @@
  línea-desde-cualquier-archivo línea-desde-cualquier-archivo ...

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

Si un trozo y su contexto contienen dos o más líneas, sus números de línea se ven así . 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.start,count

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

  • +
    Se agregó una línea aquí al primer archivo.
  • -
    Aquí se eliminó una línea del primer archivo.
Todd A. Jacobs
fuente
68

Análisis de ejemplo simple

El formato es básicamente el mismo que el diff -udiff 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 @@ medio:

  • -1,6significa que esta parte del primer archivo comienza en la línea 1 y muestra un total de 6 líneas. Por tanto, muestra las líneas 1 a 6.

    1
    2
    3
    4
    5
    6
    

    -significa "antiguo", como solemos llamarlo diff -u old new.

  • +1,4significa que esta parte del segundo archivo comienza en la línea 1 y muestra un total de 4 líneas. Por tanto, muestra las líneas 1 a 4.

    + 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 @@ porque el segundo trozo es análogo:

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

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

    11
    12
    13
    16
    

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

Encabezado de hunk

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

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

Esto también se puede obtener con la -pbandera de llano diff.

Ejemplo: archivo 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 cuenta que esta no es la línea correcta para func1: omitió líneas 1y 2.

Esta asombrosa característica a menudo dice exactamente a qué función o clase pertenece cada trozo, lo cual es muy útil para interpretar la diferencia.

Cómo funciona exactamente el algoritmo para elegir el encabezado se discute en: ¿De dónde proviene el extracto del encabezado git diff hunk?

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente
Ah, entonces leería @@ -1,6 +1,4 @@como "A partir de la línea 1, el recuento de líneas antiguas era 6 pero el recuento de líneas nuevas es 4"
Cloud
1
@Cloud yup eso es todo :-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
6

Es la información actual del rango del trozo que indica en qué números de línea comienza y termina este trozo de diferencia.

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

Yuval Adam
fuente
Gracias. Ayudado. Cuando no hay comas al final y s, el valor predeterminado es 1.
SSEMember