2011-12-19 1 views

Répondre

52

On les appelle (c) en-têtes et contiennent les informations de plage.

Ils sont entourés de double aux signes @@. Ils sont au format:

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

l est le numéro de la ligne de départ et s est le nombre de lignes du changement (c) gros morceau applique pour chaque fichier respectif. Le - indique le fichier d'origine et le + indique le nouveau fichier (modifié). Notez qu'il affiche non seulement les lignes affectées, mais aussi les lignes de contexte. Le -1,5 est dans le fichier original (indiqué par le -).

Le +1,9 se trouve dans le nouveau fichier (modifié) (indiqué par le +) et la première ligne correspond au début et aux 9 lignes de contexte affectées.

Plus de détails ici: http://en.wikipedia.org/wiki/Diff#Unified_format

+0

Donc les chiffres se réfèrent au contexte du morceau +? c'est-à-dire les lignes imprimées par git sont les lignes du morceau (changé) plus 3 lignes avant et 3 lignes après les lignes du morceau (changé). Ainsi, la plage de lignes va du début du contexte à la fin du contexte, c'est-à-dire de 3 lignes avant la première ligne modifiée à 3 lignes après la dernière ligne modifiée? – Will

5

Elles décrivent les lignes affectées par le différentiel. Dans votre cas, cela signifie que le morceau affecte 5 lignes à partir de la ligne 1, ce qui entraîne un remplacement à partir de la ligne 1 qui a 9 lignes.

Notez qu'il s'agit du format utilisé par le format diff unifié. Le format diff "classique" utilise un modèle différent (mais qui utilise le diff classique ces jours-ci?).

15

Exemple d'analyse simple

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

Par exemple:

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

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

@@ -1,6 +1,4 @@ 
1 
-2 
-3 
4 
5 
6 
@@ -11,6 +9,4 @@ 
11 
12 
13 
-14 
-15 
16 

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

  • -1,6: ce qui correspond à la pièce à la ligne 1 à 6 du premier fichier:

    1 
    2 
    3 
    4 
    5 
    6 
    

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

  • +1,4 indique que cette pièce correspond aux lignes 1 à 4 du deuxième fichier.

    + signifie «nouveau».

    Nous avons seulement 4 lignes au lieu de 6 parce que 2 lignes ont été enlevées! Le nouveau beau gosse est juste:

    1 
    4 
    5 
    6 
    

@@ -11,6 +9,4 @@ pour le deuxième gros 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 ligne 9 du nouveau fichier parce que nous avons déjà supprimé 2 lignes sur le morceau précédent: 2 et 3.

tête Hunk

En fonction de votre version et de votre configuration git, vous pouvez également obtenir une ligne de code à côté de la ligne @@, par ex. le func1() { dans:

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

Cela peut aussi être obtenu avec le drapeau -p de plaine diff.

Exemple: ancien fichier:

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

Si on enlève la ligne 6, la 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 1 et 2 .

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

Comment l'algorithme de choisir au fonctionne exactement est discuté de l'en-tête: Where does the excerpt in the git diff hunk header come from?

+1

Ceci est probablement la meilleure explication du différentiel. – mahonya

+0

Eh bien, j'ai ce @@ -20,7 +20,8 @@ UserDefinedStitcher et je pensais que peut-être il me disait que mes changements étaient à la ligne 20, ou plutôt, 20 lignes en avant de la ligne 6. (Ligne 6 est le ligne qui dit UserDefinedStitcher.) Mais cela m'amène à la ligne 26, mais mes changements étaient sur la ligne 23. Donc, il semblerait que git est sorti par 3 lignes. Que se passe-t-il? – Will

+0

@Nous produirons un exemple reproductible minimal. –