web-dev-qa-db-fra.com

Que signifie "@@ -1 +1 @@" dans la sortie diff de Git?

J'ai collecté des données à partir des informations renvoyées par

git diff <commitId>..<commitId>

et je suis tombé sur @@ -1 +1 @@

Je ne peux pas comprendre ce que cela me dit. J'ai cherché un peu sur Google mais en vain.

93
SSEMember

C'est un identifiant de morceau diff unifié. C'est documenté par GNU Diffutils.

Le format de sortie unifié commence par un en-tête de deux lignes, qui ressemble à ceci:

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

L'horodatage ressemble à 2002-02-21 23:30:39.942229878 -0800 pour indiquer la date, l'heure avec des fractions de seconde et le fuseau horaire. Les secondes fractionnaires sont omises sur les hôtes qui ne prennent pas en charge les horodatages fractionnaires.

Vous pouvez modifier le contenu de l'en-tête avec le --label=label option; voir Voir Noms alternatifs .

Viennent ensuite un ou plusieurs morceaux de différences; chaque morceau montre une zone où les fichiers diffèrent. Les mecs au format unifié ressemblent à ceci:

 @@ des numéros de ligne de fichier aux numéros de ligne de fichier @@ 
 ligne de l'un ou l'autre fichierligne de l'un ou l'autre fichier... 

Si un morceau contient une seule ligne, seul son numéro de ligne de départ apparaît. Sinon, ses numéros de ligne ressemblent à start,count. Un morceau vide est considéré comme commençant à la ligne qui suit le morceau.

Si un morceau et son contexte contiennent deux lignes ou plus, ses numéros de ligne ressemblent à start,count. Sinon, seul son numéro de fin de ligne apparaît. Un morceau vide est considéré comme se terminant à la ligne qui précède le morceau.

Les lignes communes aux deux fichiers commencent par un caractère espace. Les lignes qui diffèrent réellement entre les deux fichiers ont l'un des caractères indicateurs suivants dans la colonne d'impression de gauche:

  • +
    Une ligne a été ajoutée ici au premier fichier.
  • -
    Une ligne a été supprimée ici du premier fichier.
63
Todd A. Jacobs

Exemple d'analyse simple

Le format est fondamentalement le même que le diff unifié diff -u.

Par exemple:

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

Ici, nous avons supprimé les lignes 2, 3, 14 et 15. Sortie:

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

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

  • -1,6 Signifie que cette partie du premier fichier commence à la ligne 1 et affiche un total de 6 lignes. Il montre donc les lignes 1 à 6.

    1
    2
    3
    4
    5
    6
    

    - Signifie "ancien", comme nous l'appelons habituellement comme diff -u old new.

  • +1,4 Signifie que cette partie du deuxième fichier commence à la ligne 1 et affiche un total de 4 lignes. Il montre donc les lignes 1 à 4.

    + Signifie "nouveau".

    Nous n'avons que 4 lignes au lieu de 6 car 2 lignes ont été supprimées! Le nouveau morceau est juste:

    01
    04
    05
    06
    

@@ -11,6 +9,4 @@ Pour le second morceau est analogue:

  • sur l'ancien fichier, nous avons 6 lignes, à partir de la ligne 11 de l'ancien fichier:

    11
    12
    13
    14
    15
    16
    
  • sur le nouveau fichier, nous avons 4 lignes, à partir de la ligne 9 du nouveau fichier:

    11
    12
    13
    16
    

    Notez que la ligne 11 Est la 9ème ligne du nouveau fichier car nous avons déjà supprimé 2 lignes sur le morceau précédent: 2 et 3.

En-tête de morceau

Selon votre version et configuration de git, vous pouvez également obtenir une ligne de code à côté de la ligne @@, Par exemple la func1() { dans:

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

Ceci peut également être obtenu avec le drapeau -p De plain diff.

Exemple: ancien fichier:

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

Si nous supprimons la ligne 6, Le diff affiche:

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

Notez que ce n'est pas la bonne ligne pour func1: Elle a sauté les lignes 1 Et 2.

Cette fonctionnalité impressionnante indique souvent exactement à quelle fonction ou classe appartient chaque morceau, ce qui est très utile pour interpréter la différence.

Comment l'algorithme pour choisir l'en-tête fonctionne exactement est discuté à: D'où vient l'extrait de l'en-tête de morceau git diff?

Il s'agit des informations de plage de morceaux actuelles indiquant sur quels numéros de ligne ce morceau diff commence et se termine.

Lisez http://en.wikipedia.org/wiki/Diff#Unified_format pour une explication approfondie.

6
Yuval Adam