2011-12-19 20 views

Respuesta

52

Se llaman (c) encabezados de línea y contienen la información de rango.

Están rodeados por doble en los signos @@. Ellos son del formato:

@@ -l,s +l,s @@ 

donde l es el número de línea de partida y s es el número de líneas del cambio (c) se aplica a trozo para cada archivo correspondiente. El - indica el archivo original y el + indica el nuevo archivo (modificado). Tenga en cuenta que no solo muestra las líneas afectadas, sino también las líneas de contexto.

El -1,5 está en el archivo original (indicado por -). Muestra que esa primera línea es el inicio y 5 líneas de contexto/afectadas

La +1,9 está en el nuevo archivo (modificado) (indicado por +) y nuevamente la primera línea es el inicio y 9 líneas afectadas/de contexto.

Más detalles aquí: http://en.wikipedia.org/wiki/Diff#Unified_format

+0

¿Entonces los números se refieren al contexto hunk +? es decir, las líneas impresas por git son las líneas hunk (modificadas) más 3 líneas antes y 3 líneas después de las líneas hunk (changed). Entonces, ¿el rango de líneas es desde el inicio del contexto hasta el final del contexto, es decir, desde 3 líneas antes de la primera línea modificada hasta 3 líneas después de la última línea modificada? – Will

5

Describen las líneas afectadas por el obstáculo. En su caso, significa que el trozo afecta a 5 líneas a partir de la línea 1, lo que da como resultado un reemplazo que comienza en la línea 1, que tiene 9 líneas de longitud.

Tenga en cuenta que este es el formato utilizado por el formato diff unificado. El formato diff "clásico" usa un modelo diferente (¿pero quién usa diff clásico en estos días?).

15

análisis ejemplo simple

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

Por ejemplo:

diff -u <(seq 16) <(seq 16 | grep -Ev '^(2|3|14|15)$') 

Aquí hemos eliminado las líneas 2, 3, 14 y 15. Producto:

@@ -1,6 +1,4 @@ 
1 
-2 
-3 
4 
5 
6 
@@ -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 archivo:

    1 
    2 
    3 
    4 
    5 
    6 
    

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

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

    + significa "nuevo".

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

    1 
    4 
    5 
    6 
    

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

  • en el archivo antiguo, tenemos 6 líneas, a partir de la línea 11 del archivo antiguo:

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

    11 
    12 
    13 
    16 
    

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

cabecera del trozo

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 ej. la func1() { en:

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

Esto también se puede obtener con la bandera -p de llanura diff.

Ejemplo: archivo antiguo:

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

Si eliminamos la línea 6, el diff 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: se omite líneas 1 y 2 .

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

Como el algoritmo para elegir la cabecera obras se discute exactamente en: Where does the excerpt in the git diff hunk header come from?

+1

Esta es probablemente la mejor explicación del diff hunk. – mahonya

+0

Bueno, tengo este @@ -20,7 +20,8 @@ UserDefinedStitcher y pensé que quizás me estaba diciendo que mis cambios estaban en la línea 20, o más bien, 20 líneas en adelante desde la línea 6. (La línea 6 es la línea que dice UserDefinedStitcher.) Pero esto me lleva a la línea 26, pero mis cambios estaban en la línea 23. Parece que git está fuera por 3 líneas. Que esta pasando? – Will

+0

@Will por favor produzca un ejemplo reproducible mínimo. –