git diff
Description
La commande git diff est utilisée pour comparer les modifications entre les commits, l'arborescence de travail (working tree) et la zone de staging. Elle prend deux ensembles de données en entrée et affiche les modifications qui les séparent. Elle est couramment utilisée en combinaison avec les commandes git status et git log pour analyser l'état d'un dépôt git.

Sorties de diff
Le diff peut produire plusieurs types de sorties qui seront abordés ci-dessous.
Format de sortie brut
Consultez les commandes ci-dessous pour créer un dépôt simple :
git diff
mkdir test_repo
cd test_repo
touch test.txt
echo "this is a git diff test example" > test.txt
git init .
#Initialized empty Git repository in /Users/kev/code/test/.git/
git add test.txt
git commit -am "add diff test file"
#[master (root-commit) 9e2dcac] add diff test file
#1 file changed, 1 insertion(+)
#create mode 100644 test.txtPour obtenir une sortie avec git diff, vous devez modifier le contenu du fichier test.txt après l'avoir ajouté au dépôt créé. Vous pouvez le faire en exécutant la commande suivante :
git diff
echo "this is a diff example" > test.txtCe n'est qu'à présent que nous pouvons afficher un diff et analyser la sortie. L'exécution de git diff produira le résultat suivant :
git diff
diff --git a/test.txt b/test.txt
index 6b0c6cf..b37e70a 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1 @@
-this is a git diff test example
+this is a diff exampleSources d'entrée du diff
Vous trouverez ci-dessous l'entrée de comparaison du diff. En conséquence, a/test.txt et b/test.txt seront transmis au diff.
git diff
diff --git a/test.txt b/test.txtMétadonnées
Cette ligne affiche certaines métadonnées internes de Git. Les chiffres dans cette sortie correspondent aux identifiants de hachage de version des objets Git.
git diff
index 6b0c6cf..b37e70a 100644Symboles pour les modifications
Ces lignes montrent les symboles attribués à chaque source d'entrée du diff. Les modifications provenant de a/test.txt sont marquées par --- et celles de b/test.txt par le symbole +++.
git diff
--- a/test.txt
+++ b/test.txtBlocs de diff (chunks)
Un diff n'affiche pas le fichier entier. Il ne montre que les lignes modifiées. Cette portion modifiée est appelée un "chunk" (bloc). L'avantage des chunks est qu'ils affichent les lignes avant et après les modifications, ce qui permet de mieux comprendre les changements.
git diff
@@ -1 +1 @@
-this is a git diff test example
+this is a diff exampleLa première ligne est l'en-tête du chunk. Chaque chunk est précédé d'un en-tête entre des symboles @@. Les modifications apportées au fichier sont résumées dans cet en-tête.
Indicateurs courants (flags)
Git propose plusieurs indicateurs utiles pour différents flux de travail :
--staged(ou--cached) : Compare les modifications mises en staging dans l'index avec le commit HEAD.--stat: Affiche un résumé condensé des fichiers modifiés au lieu du diff complet.--name-only: Ne sort que les noms des fichiers modifiés.
Mise en évidence des modifications
Vous pouvez utiliser les 2 outils suivants pour mettre en évidence les modifications afin de les rendre plus visibles.
git diff --color-words
La première méthode de mise en évidence des modifications est le mode spécial proposé par git diff : --color-words. Il découpe les lignes ajoutées et supprimées par espaces, puis calcule le diff sur ces tokens.
git diff
git diff --color-words
diff --git a/test.txt b/test.txt
index 6b0c6cf..b37e70a 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1 @@
-this is a git diff test example
+this is a diff example(Remarque : --color-words met en évidence les modifications en ligne à l'aide des couleurs du terminal. En texte brut, le format de sortie correspond au diff standard.)
git diff-highlight
Lors du clonage des sources de Git, un sous-répertoire nommé contrib sera trouvé. Ce sous-répertoire contient des outils liés à Git. L'un de ces outils s'appelle diff-highlight. Il met en évidence les parties de mots modifiées. Notez que cet outil filtre l'entrée standard et nécessite la coloration du terminal pour être visible.
git diff
git diff | git diff-highlight
diff --git a/test.txt b/test.txt
index 6b0c6cf..b37e70a 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1 @@
-this is a git diff test example
+this is a diff exampleDiff de fichiers binaires
git diff peut être exécuté non seulement sur des fichiers texte, mais aussi sur des fichiers binaires. L'option par défaut n'est parfois pas très utile.
git diff
git diff
Binary files a/script.pdf and b/script.pdf differGit dispose d'une fonctionnalité permettant de spécifier une commande shell pour convertir le contenu des fichiers binaires en texte avant d'effectuer le diff. Cependant, une petite configuration peut être nécessaire. Tout d'abord, vous devez définir un filtre textconv avec la description de la méthode de conversion d'un certain type de binaire en texte. Par exemple, vous pouvez utiliser un utilitaire simple appelé pdftohtml (disponible via Homebrew) pour convertir un PDF en HTML. Il existe deux façons de le configurer : en modifiant le fichier .git/config, ou globalement, en modifiant .gitconfig.
git diff
[diff "pdfconv"]
textconv=pdftohtml -stdoutEnsuite, vous devez associer un ou plusieurs motifs de fichiers au filtre pdfconv, ce qui peut se faire en créant un fichier .gitattributes à la racine du dépôt.
git diff
*.pdf diff=pdfconvAprès la configuration, git diff exécutera d'abord le fichier binaire via le script de conversion configuré, puis effectuera le diff sur la sortie du convertisseur. En utilisant la même technique, vous pouvez également obtenir des diffs utiles pour tous types de fichiers binaires (zips, jars et autres archives).
Comparaison de fichiers : git diff file
La commande git diff dispose également d'une option explicite pour le chemin du fichier. L'opération git diff traitera le fichier spécifique une fois que le chemin du fichier lui sera passé. Dans l'exemple ci-dessous, l'argument ./path/to/file comparera les modifications dans le répertoire de travail avec le commit HEAD.
git diff
git diff HEAD ./path/to/fileComparaison de toutes les modifications
Pour comparer les modifications dans tout le dépôt, vous devez exécuter git diff sans spécifier de chemin de fichier. Ainsi, vous pouvez invoquer les exemples ci-dessus sans l'argument ./path/to/file et obtenir les mêmes résultats pour tous les fichiers du dépôt local.
Modifications depuis le dernier commit
Par défaut, git diff compare le répertoire de travail avec la zone de staging (index). Pour afficher toutes les modifications non validées depuis le commit le plus récent :
git diff
git diffComparaison de fichiers entre deux commits
La commande git diff peut recevoir des références Git (refs), telles que des noms de têtes, de tags et de branches. Chaque commit dans Git possède un identifiant de commit unique, que vous pouvez trouver en exécutant git log. Vous pouvez également passer deux identifiants de commit pour les comparer directement :
git diff
git diff <commit-hash-1> <commit-hash-2>Comparaison de branches
La comparaison de branches s'exécute de manière similaire aux autres entrées de type ref pour git diff. Voyons des exemples avec l'opérateur point :
git diff
git diff branch1..branch2Les deux points dans l'exemple ci-dessus indiquent que l'entrée du diff correspond aux têtes des deux branches. Vous obtiendrez le même résultat si les points sont omis et qu'un espace est utilisé entre les branches. De plus, il existe un opérateur à trois points :
git diff
git diff branch1...branch2L'opérateur à trois points modifie le premier paramètre d'entrée branch1 qui initie le diff. Il transforme branch1 en une référence au commit ancêtre commun partagé entre les deux entrées du diff. Le dernier paramètre d'entrée reste identique à la tête de branch2.
Comparaison de fichiers entre deux branches
Pour comparer un fichier spécifique dans les branches, vous devez passer le chemin du fichier en tant que troisième argument à git diff :
git diff
git diff master new_branch ./test.txtPractice
Quelles sont les fonctionnalités et options de la commande 'git diff' ?