Comment lire le résultat de git diff
? La page de manuel pour git-diff
est plutôt longue et explique de nombreux cas qui ne semblent pas nécessaires pour un débutant. Par exemple:
git diff origin/master
Comment lire le résultat de git diff
? La page de manuel pour git-diff
est plutôt longue et explique de nombreux cas qui ne semblent pas nécessaires pour un débutant. Par exemple:
git diff origin/master
Permet de jeter un oeil à l'exemple avancé git diff de l'histoire (en commettre 1088261f dans git.dépôt git):
diff --git a/builtin-http-fetch.c b/http-fetch.c
similarity index 95%
rename from builtin-http-fetch.c
rename to http-fetch.c
index f3e63d7..e8f44ba 100644
--- a/builtin-http-fetch.c
+++ b/http-fetch.c
@@ -1,8 +1,9 @@
#include "cache.h"
#include "walker.h"
-int cmd_http_fetch(int argc, const char **argv, const char *prefix)
+int main(int argc, const char **argv)
{
+ const char *prefix;
struct walker *walker;
int commits_on_stdin = 0;
int commits;
@@ -18,6 +19,8 @@ int cmd_http_fetch(int argc, const char **argv, const char *prefix)
int get_verbosely = 0;
int get_recover = 0;
+ prefix = setup_git_directory();
+
git_config(git_default_config, NULL);
while (arg < argc && argv[arg][0] == '-') {
Permet l'analyse de ce patch, ligne après ligne.
La première ligne
diff --git a/builtin-http-fetch.c b/http-fetch.cest un "git diff" en-tête de la forme
diff --git a/file1 b/file2
. L' a/
et b/
noms de fichiers sont les mêmes, sauf renommer/copier (comme dans notre cas). L' --git
est-à-dire que la diff est dans le "git" diff format.Suivant une ou plusieurs étendues lignes d'en-tête. Les trois premiers
indice de similarité de 95% renommer de builtin-http-fetch.c renommer http-fetch.cnous dire que le fichier a été renommé en
builtin-http-fetch.c
de http-fetch.c
et que ces deux fichiers sont à 95% identique (qui a été utilisé pour détecter cette renommer).l'indice de f3e63d7..e8f44ba 100644nous parler de mode de fichier donné (
100644
signifie que c'est un fichier ordinaire et non pas par exemple de lien symbolique, et qu'il n'a pas exécutable bit d'autorisation), et sur raccourcie de hachage de preimage (la version du fichier avant modification) et postimage (la version du fichier après le changement). Cette ligne est utilisée par git am --3way
pour essayer de faire un 3-way merge si le patch ne peut pas être appliquée.La prochaine est à deux lignes de différences unifiées en-tête
--- a/builtin-http-fetch.c +++ b/http-fetch.cComparé à d'
diff -U
résultat il n'a pas de fichier-modification-temps, ni pour les fichiers de modification de temps après la source (preimage) et de destination (postimage) les noms de fichiers. Si le fichier a été créé à la source est - /dev/null
; si le fichier a été supprimé, la cible est - /dev/null
.diff.mnemonicPrefix
variable de configuration à la vraie, à la place de a/
et b/
préfixes dans ce deux-ligne d'en-tête vous pouvez avoir à la place c/
, i/
, w/
et o/
comme des préfixes, respectivement à ce que vous les comparer; voir git-config(1)
Viennent ensuite un ou plusieurs mecs de différences; chaque morceau montre un domaine où les fichiers sont différents. Format unifié mecs commence avec la ligne comme
@@ -1,8 +1,9 @@ou
@@ -18,6 +19,8 @@ int cmd_http_fetch(int argc, const char **argv, .... C'est dans le format
@@ from-file-range to-file-range @@ [header]
. La de-fichier-plage est sous la forme -<start line>,<number of lines>
, et celui du fichier de gamme est +<start line>,<number of lines>
. À la fois la ligne de départ et le nombre de lignes reportez-vous à la position et la longueur de morceau à l'preimage et de postimage, respectivement. Si le nombre de lignes pas indiqué, cela signifie qu'il est de 0.
L'en-tête facultatif montre la fonction C où chaque changement se produit, si c'est un fichier C (comme -p
option dans GNU diff), ou l'équivalent, le cas échéant, pour d'autres types de fichiers.
Vient ensuite la description de l'emplacement où les fichiers diffèrent. Les lignes communes aux deux fichiers commencent par un caractère espace. Les lignes qui en fait diffèrent entre les deux fichiers de l'un des caractères de l'affichage dans la partie gauche de l'impression de la colonne:
Ainsi, par exemple, le premier morceau
#include "cache.h"
#include "walker.h"
-int cmd_http_fetch(int argc, const char **argv, const char *prefix)
+int main(int argc, const char **argv)
{
+ const char *prefix;
struct walker *walker;
int commits_on_stdin = 0;
int commits;
signifie qu' cmd_http_fetch
a été remplacé par main
, et qu' const char *prefix;
ligne a été ajoutée.
En d'autres termes, avant le changement, le fragment approprié de " builtin-http-fetch.c' fichier ressemble à ceci:
#include "cache.h"
#include "walker.h"
int cmd_http_fetch(int argc, const char **argv, const char *prefix)
{
struct walker *walker;
int commits_on_stdin = 0;
int commits;
Après le changement de ce fragment de maintenant " http chercher.c' fichier ressemble à ceci à la place:
#include "cache.h"
#include "walker.h"
int main(int argc, const char **argv)
{
const char *prefix;
struct walker *walker;
int commits_on_stdin = 0;
int commits;
Il pourrait y avoir
\ N saut de ligne en fin de fichierla ligne actuelle (il n'est pas dans l'exemple de diff).
Comme Donal aviez dit , il est préférable de pratiquer la lecture diff sur les exemples de la vie réelle, où vous savez ce que vous avez changé.
Références:
Voici l'exemple simple.
diff --git a/file b/file
index 10ff2df..84d4fa2 100644
--- a/file
+++ b/file
@@ -1,5 +1,5 @@
line1
line2
-this line will be deleted
line4
line5
+this line is added
Voici une explication (voir les détails ici).
--git
n'est pas une commande, cela signifie que c'est une version git de diff (pas unix)a/ b/
sont des répertoires, ils ne sont pas réels. c'est juste une commodité lorsque nous traitons avec le même fichier (dans mon cas un/ se trouve dans l'index et b/ est dans le répertoire de travail)10ff2df..84d4fa2
sont Id d'objet blob de ces 2 fichiers100644
est le mode "bits", indiquant que c'est un fichier normal (non exécutable et non pas un lien symbolique)--- a/file +++ b/file
le signe moins indique les lignes dans le cas d'une version mais manquant de la b/ version; et les signes plus présente des lignes manquantes dans un/ mais présent dans b/ (dans mon cas, - - - les lignes supprimées et +++ signifie ajouté des lignes de b/ et ce le fichier dans le répertoire de travail)@@ -1,5 +1,5 @@
, pour comprendre cela, il est préférable de travailler avec un gros fichier; si vous avez deux changements dans les différents lieux que vous pourrez obtenir deux entrées comme @@ -1,5 +1,5 @@
; supposons que vous avez un fichier line1 ... line100 et supprimé line10 et d'ajouter de nouvelles line100 - vous obtiendrez:@@ -7,7 +7,6 @@ line6 line7 line8 line9 -this line10 to be deleted line11 line12 line13 @@ -98,3 +97,4 @@ line97 line98 line99 line100 +this is new line100
Le format de sortie par défaut (qui à l'origine vient d'un programme connu sous le nom diff
si vous voulez un look pour plus d'info) est connu comme un "diff unifié". Il contient essentiellement 4 types de lignes:
+
,-
, etJe vous conseille de pratiquer la lecture différences entre deux versions d'un fichier où vous savez exactement ce que vous avez changé. Comme ça, vous allez reconnaître ce qui se passe quand vous le voyez.
Sur mon mac:
info diff
sélectionnez: Output formats
-> Context
-> Unified format
-> Detailed Unified
:
Ou en ligne homme diff sur gnu suivant le même chemin que pour le même article:
Fichier: diff.info, Nœud Détaillé Unifiée, Suivant: Exemple Unifiée, Jusqu': Format Unifié
Description détaillée du Format Unifié ......................................
Le format unifié commence avec une à deux lignes d'en-tête, qui ressemble comme 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 secondes, et le temps de la zone.
Vous pouvez modifier l'en-tête du contenu avec `--label=LABEL " option; voir *Remarque Noms Alternatifs::.
Viennent ensuite un ou plusieurs mecs de les différences; chaque morceau montre une zone lorsque les fichiers sont différents. Unifiée format un beau ressembler à ceci:
@@ FROM-FILE-RANGE TO-FILE-RANGE @@ LINE-FROM-EITHER-FILE LINE-FROM-EITHER-FILE...
Les lignes communes aux deux fichiers commencer par un caractère espace. L' les lignes qui en fait diffèrent entre les deux fichiers ont l'une des opérations suivantes les caractères de l'affichage dans la partie gauche de l'impression colonne:
`+' Une ligne a été ajoutée ici pour le premier fichier.
`-' Une ligne a été supprimé ici à partir du premier fichier.
Il n'est pas clair à partir de votre question, car une partie de la diff de vous trouver à confusion: le fait diff, ou l'en-tête supplémentaire d'informations git imprime. Juste au cas où, voici un rapide aperçu de l'en-tête.
La première ligne est quelque chose comme diff --git a/path/to/file b/path/to/file
- bien évidemment, il est juste à vous dire ce fichier cette section du diff est pour. Si vous définissez le booléen variable de config diff.mnemonic prefix
, a
et b
sera modifié pour plus de lettres descriptives comme c
et w
(commit et le travail de l'arbre).
Ensuite, il y a le mode "lignes" les lignes de vous donner une description de toute modification qui n'impliquent pas de changer le contenu du fichier. Cela inclut de nouvelles/supprimé des fichiers, de les renommer/copier les fichiers, et les modifications d'autorisations.
Enfin, il y a une ligne comme celle - index 789bd4..0afb621 100644
. Vous aurez probablement jamais les soins à ce sujet, mais ces 6 chiffres les nombres hexadécimaux sont l'abrégé SHA1 hash du vieux et du nouveau blobs pour ce fichier (un blob est un git objet de stockage de données brutes comme le contenu du fichier). Et bien sûr, l' 100644
le fichier est-il de la mode - les trois derniers chiffres sont évidemment des autorisations; les trois premiers donner plus de fichier d'informations de métadonnées (DONC post décrivant).
Après ça, vous êtes sur la norme unifiée de la sortie de la commande diff (tout comme le classique diff -U
). Il est divisé en les beaux mecs - un morceau est une section du fichier contenant des changements et de leur contexte. Chaque morceau est précédé par une paire de ---
et +++
des lignes indiquant le fichier en question, ensuite la diff est (par défaut) trois lignes de contexte de chaque côté de l' -
et +
lignes montrant l'supprimé/ajouté des lignes.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.