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.

SSEMembre
la source
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.
Todd A. Jacobs
la source
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?

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
la source
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
1
@Cloud yup c'est ça :-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
6

Ce sont les informations de plage de morceau actuel indiquant sur quels numéros de ligne ce morceau de diff commence et se termine.

Lisez http://en.wikipedia.org/wiki/Diff#Unified_format pour une explication détaillée.

Yuval Adam
la source
Merci. Aider. Lorsqu'il n'y a pas de virgule et de s, la valeur par défaut est 1.
SSEMember