Aller au contenu

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.

gitdiff

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

bash
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.txt

Pour 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

bash
echo "this is a diff example" > test.txt

Ce 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

bash
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

Sources 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

bash
diff --git a/test.txt b/test.txt

Mé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

bash
index 6b0c6cf..b37e70a 100644

Symboles 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

bash
--- a/test.txt
+++ b/test.txt

Blocs 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

bash
@@ -1 +1 @@
-this is a git diff test example
+this is a diff example

La 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

bash
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

bash
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 example

Diff 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

bash
git diff
Binary files a/script.pdf and b/script.pdf differ

Git 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

bash
[diff "pdfconv"]
textconv=pdftohtml -stdout

Ensuite, 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

bash
*.pdf diff=pdfconv

Aprè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

bash
git diff HEAD ./path/to/file

Comparaison 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

bash
git diff

Comparaison 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

bash
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

bash
git diff branch1..branch2

Les 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

bash
git diff branch1...branch2

L'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

bash
git diff master new_branch ./test.txt

Practice

Quelles sont les fonctionnalités et options de la commande 'git diff' ?

Trouvez-vous cela utile?

Aperçu dual-run — comparez avec les routes Symfony en production.