it-swarm-pt.tech

O que significa a meta-linha “@@… @@” com sinais em svn diff ou git diff?

Quando eu uso svn diff ou git diff mostra linhas como:

@@ -1,5 +1,9 @@

O que eles querem dizer?

60
vietstone

Esses são chamados de (c) cabeçalhos de hunk e contêm as informações do intervalo.

Eles são cercados por sinais duplos @@. Eles estão no formato:

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

onde l é o número da linha inicial e s é o número de linhas às quais o pedaço de alteração (c) se aplica a cada arquivo respectivo. O - Indica o arquivo original e o + Indica o novo arquivo (modificado). Observe que ele não apenas mostra as linhas afetadas, mas também as linhas de contexto.

O -1,5 Está no arquivo original (indicado por -). Isso mostra que a primeira linha é a inicial e as 5 linhas afetadas/de contexto

O +1,9 Está no novo arquivo (modificado) (indicado por +) E, novamente, a primeira linha é o início e as 9 linhas de contexto/afetadas.

Mais detalhes aqui: http://en.wikipedia.org/wiki/Diff#Unified_format

59
manojlds

Análise de exemplo simples

O formato é basicamente o mesmo que o diff unificado diff -u.

Por exemplo:

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

Aqui removemos as linhas 2, 3, 14 e 15. Saída:

@@ -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 Significa que esta parte do primeiro arquivo começa na linha 1 e mostra um total de 6 linhas. Portanto, mostra as linhas 1 a 6.

    1
    2
    3
    4
    5
    6
    

    - Significa "antigo", como costumamos chamar como diff -u old new.

  • +1,4 Significa que esta parte do segundo arquivo começa na linha 1 e mostra um total de 4 linhas. Portanto, mostra as linhas 1 a 4.

    + Significa "novo".

    Temos apenas 4 linhas em vez de 6 porque 2 linhas foram removidas! O novo pedaço é apenas:

    1
    4
    5
    6
    

@@ -11,6 +9,4 @@ Para o segundo pedaço é análogo:

  • no arquivo antigo, temos 6 linhas, começando na linha 11 do arquivo antigo:

    11
    12
    13
    14
    15
    16
    
  • no novo arquivo, temos 4 linhas, começando na linha 9 do novo arquivo:

    11
    12
    13
    16
    

    Observe que a linha 11 É a 9ª linha do novo arquivo, porque já removemos duas linhas no pedaço anterior: 2 e 3.

Cabeçalho do pedaço

Dependendo da versão e configuração do git, você também pode obter uma linha de código ao lado da linha @@, Por exemplo a func1() { em:

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

Isso também pode ser obtido com a bandeira -p Da planície diff.

Exemplo: arquivo antigo:

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

Se removermos a linha 6, O diff mostrará:

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

Observe que esta não é a linha correta para func1: Pulou as linhas 1 E 2.

Esse recurso impressionante geralmente informa exatamente a qual função ou classe cada pedaço pertence, o que é muito útil para interpretar o diff.

Como o algoritmo para escolher o cabeçalho funciona exatamente é discutido em: De onde vem o trecho do cabeçalho do git diff hunk?

Eles descrevem as linhas afetadas pelo diff diff. No seu caso, isso significa que o pedaço afeta 5 linhas começando na linha 1, resultando em uma substituição começando na linha 1, que tem 9 linhas.

Observe que este é o formato usado pelo formato diff unificado. O formato diff "clássico" usa um modelo diferente (mas quem usa diff clássico atualmente?).

5
fge