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


104

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

git diff <commitId>..<commitId>

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

Je n'arrive pas à comprendre ce que ça me dit. J'ai cherché un peu sur Google mais en vain.


Pouvez-vous décrire quel fichier aboutit à un tel en-tête?
kworr

@kworr c'est une question stupide, tout diff au format unifié a des en-têtes de plage.
Yuval Adam

@YuvalAdam: en fait le format unifié diff a plus de champs qui devraient être remplis comme [- +] <position>, <lines> et ici nous n'avons aucun changement affiché mais cela change touche la première ligne du fichier.
kworr

Réponses:


69

C'est un identificateur de morceau de diff unifié. Ceci 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 semble 2002-02-21 23:30:39.942229878 -0800indiquer la date, l'heure avec des fractions de seconde et le fuseau horaire. Les fractions de seconde 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 l' --label=labeloption; voir Voir Noms alternatifs .

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

@@ numéros-de-ligne-de-fichier-numéros -de-ligne-de-fichier
  @@
  ligne-de-l'un ou l'autre-fichier ligne-de-l'un ou l'autre-fichier ...

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

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

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.

69

Analyse d'exemple simple

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

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 @@ veux dire:

  • -1,6signifie que ce morceau du premier fichier commence à la ligne 1 et affiche un total de 6 lignes. Par conséquent, il affiche les lignes 1 à 6.

    1
    2
    3
    4
    5
    6
    

    -signifie «ancien», comme nous l'appelons habituellement diff -u old new.

  • +1,4signifie que cette partie du deuxième fichier commence à la ligne 1 et affiche un total de 4 lignes. Par conséquent, il affiche 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 deuxième morceau est analogue:

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

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

    11
    12
    13
    16
    

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

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 le func1() {in:

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

Ceci peut également être obtenu avec le -pdrapeau de plaine diff.

Exemple: ancien fichier:

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

Si nous supprimons la ligne 6, le diff montre:

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

Notez que ce n'est pas la bonne ligne pour func1: il a sauté des lignes 1et 2.

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

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


Ah, donc je lirais @@ -1,6 +1,4 @@comme "À partir de la ligne 1, l'ancien nombre de lignes était de 6 mais le nouveau nombre de lignes est de 4"
Cloud le


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.