Lorsque j'utilise svn diff
ou git diff
il montre des lignes comme:Que signifie la méta-ligne "@@ ... @@" avec les signes at dans svn diff ou git diff?
@@ -1,5 +1,9 @@
Que signifient-ils?
Lorsque j'utilise svn diff
ou git diff
il montre des lignes comme:Que signifie la méta-ligne "@@ ... @@" avec les signes at dans svn diff ou git diff?
@@ -1,5 +1,9 @@
Que signifient-ils?
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 @@
où 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
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
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?).
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?
Ceci est probablement la meilleure explication du différentiel. – mahonya
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
@Nous produirons un exemple reproductible minimal. –
Superset: http://stackoverflow.com/questions/2529441/how-to-work-with-diff-representation-in-git/31615438 # 31615438 –