GitVoici le treizième volet de la formation Git. Dans mon précédent article, nous avons vu en détail la gestion de l’historique de Git et les différentes manières de visualiser l’évolution d’un projet grâce à la commande git log. Nous allons poursuivre notre investigation de l’historique avec la commande git diff qui permet de visualiser les modifications entre les commits successifs.

C’est quoi la différence ?

Nous allons nous servir des fichiers de l’atelier pratique formation-git/atelier-09 pour une petite démonstration. Avant de faire quoi que ce soit, effectuez une copie du dépôt Git pour travailler dessus :

$ cd ~/formation-git/
$ cp -R atelier-09/ atelier-18
$ cd atelier-18/

Inspectons sommairement le contenu et l’état du dépôt :

$ ls
Entretien.md  Roadtrip.md
$ git status
On branch master
nothing to commit, working tree clean
$ git branch
* master
$ git log --oneline
9159976 (HEAD -> master) Ajout du fichier Entretien.
4220c4c Ajout du fichier Roadtrip.

Voici à quoi ressemble mon fichier Roadtrip.md :

$ cat Roadtrip.md 
# Roadtrip en moto

- Orpierre

- Briançon

- Chiavenna

- Innsbruck

Je vais éditer ce fichier pour ajouter une destination :

# Roadtrip en moto
  
- Orpierre

- Briançon

- Chiavenna

- Innsbruck

- Vienne

Mon fichier Roadtrip.md vient donc d’être modifié :

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   Roadtrip.md

no changes added to commit (use "git add" and/or "git commit -a")

La commande git diff me permet d’afficher le détail de ces modifications :

$ git diff
diff --git a/Roadtrip.md b/Roadtrip.md
index 6232f70..d72992d 100644
--- a/Roadtrip.md
+++ b/Roadtrip.md
@@ -7,3 +7,5 @@
 - Chiavenna
 
 - Innsbruck
+
+- Vienne

Essayons de décortiquer un peu cet affichage quelque peu touffu :

  • Dans la configuration par défaut, git diff affiche la différence entre l’index et le répertoire de travail.
  • Le fichier a/Roadtrip.md correspond à l’ancienne version, celle qui est stockée dans l’index.
  • Quant au fichier b/Roadtrip.md, c’est la version modifiée dans le répertoire de travail.
  • Vous pouvez sereinement ignorer la ligne index 6232f70..d72992d 100644.
  • Chaque ligne préfixée par un signe - est contenue dans l’ancienne version.
  • Une ligne préfixée par un signe + est contenue dans la version modifiée.
  • git diff nous affiche un extrait de quelques lignes avec un peu de contexte.
  • Les arobases @@ symbolisent le début d’un tel extrait.
  • 7,3 signifie que l’extrait en question commence à la ligne 7 et comporte 3 lignes.

À présent, ajoutez le fichier modifié à l’index et voyez ce qui se passe :

$ git add Roadtrip.md 
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   Roadtrip.md
$ git diff

La commande git diff n’affiche plus rien, ce qui est normal. Nous venons de voir que dans sa configuration par défaut, elle nous affiche la différence entre l’index et le répertoire de travail. Dès que nous ajoutons le fichier Roadtrip.md modifié à la zone d’indexation, les deux versions de ce fichier sont identiques.

Pour afficher les modifications indexées, je vais utiliser l’option --staged :

$ git diff --staged
diff --git a/Roadtrip.md b/Roadtrip.md
index 6232f70..d72992d 100644
--- a/Roadtrip.md
+++ b/Roadtrip.md
@@ -7,3 +7,5 @@
 - Chiavenna
 
 - Innsbruck
+
+- Vienne

Deux petites précisions :

  • À partir du moment où j’utilise l’option --staged, git diff va m’afficher la différence entre la zone d’indexation et la base de données d’objets.
  • L’option --cached est identique à l’option --staged. Vous pouvez utiliser l’une ou l’autre selon votre préférence. Leur fonctionnement est identique.

Maintenant, validez les modifications et observez à nouveau ce qui se passe :

$ git commit -m "Ajout d'une destination."
[master 3632edc] Ajout d'une destination.
 1 file changed, 2 insertions(+)
$ git status
On branch master
nothing to commit, working tree clean
$ git diff
$ git diff --staged

C’est exactement ce à quoi il fallait s’attendre, puisque dans l’état actuel des choses, l’état de notre fichier Roadmap.md est identique dans le répertoire de travail, dans la zone d’indexation et dans la base de données d’objets.

Que se passe-t-il si j’ajoute un fichier dans mon dépôt ? Créez un fichier Cartes.md et éditez-le comme ceci :

# Cartes routières

- [ ] France

- [ ] Italie

- [ ] Suisse

- [ ] Autriche

Si j’invoque git diff, je ne verrai rien :

$ git diff

C’est tout à fait normal, puisque git diff ne gère que les fichiers suivis. Je vais donc ajouter Cartes.md à l’index de Git :

$ git add Cartes.md

Comme il faut s’y attendre, le contenu du répertoire de travail et de la zone d’indexation est identique :

$ git diff

Je vais donc utiliser l’option --staged pour afficher les modifications depuis le dernier commit :

$ git diff --staged
diff --git a/Cartes.md b/Cartes.md
new file mode 100644
index 0000000..a6e35b6
--- /dev/null
+++ b/Cartes.md
@@ -0,0 +1,9 @@
+# Cartes routières
+
+- [ ] France
+
+- [ ] Italie
+
+- [ ] Suisse
+
+- [ ] Autriche
  • Ici, /dev/null signifie « rien ». Autrement dit, Git compare ce nouveau fichier à rien du tout.

Validez ce fichier :

$ git commit -m "Ajout du fichier Cartes."
[master c04a40b] Ajout du fichier Cartes.
 1 file changed, 9 insertions(+)
 create mode 100644 Cartes.md

Une fois que mes changements sont validés, l’état de mon fichier Cartes.md est identique dans le répertoire de travail, dans l’index et dans la base :

$ git diff
$ git diff --staged

Est-ce qu’il est possible de faire un voyage dans le temps pour afficher les modifications effectuées entre deux commits plus anciens ? Dans ce cas, comment est-ce que nous pourrions nous y prendre ?

Pour commencer, affichez l’historique du dépôt :

$ git log --oneline
c04a40b (HEAD -> master) Ajout du fichier Cartes.
3632edc Ajout d'une destination.
9159976 Ajout du fichier Entretien.
4220c4c Ajout du fichier Roadtrip.

Chaque commit dans cette liste est identifié par un ID unique, même si celui-ci est tronqué à sept caractères par l’option --oneline.

Admettons que je souhaite afficher les modifications effectuées entre le commit 9159976 (Ajout du fichier Entretien) et le commit 3632edc (Ajout d'une destination). Étant donné qu’il s’agit là de la modification que j’ai effectuée au tout début de cet atelier pratique, je devrais obtenir un résultat similaire pour ne pas dire identique. En effet :

$ git diff 9159976 3632edc
diff --git a/Roadtrip.md b/Roadtrip.md
index 6232f70..d72992d 100644
--- a/Roadtrip.md
+++ b/Roadtrip.md
@@ -7,3 +7,5 @@
 - Chiavenna
 
 - Innsbruck
+
+- Vienne

Nous pouvons également visualiser les modifications effectuées dans une branche par rapport à une autre branche. Pour voir ce que ça donne en pratique, prenons un dépôt dans lequel nous disposons de plusieurs branches. Au hasard tout en choisissant bien :

$ cd ~/formation-git/atelier-16

Faisons un peu de recherche sur l’état et l’historique de ce dépôt :

$ ls 
hello.sh
$ git status
On branch master
nothing to commit, working tree clean
$ git branch
  hello-cow
  hello-figlet
* master
$ git log --oneline --all --graph
*   403fb57 (HEAD -> master) Merge branch 'hello-figlet'.
|\  
| * d0c718c (hello-figlet) Message en lettres ASCII.
* | 36bfb46 (hello-cow) Message avec une vache qui parle.
|/  
* 797fe52 Commit initial.

Si je souhaite afficher la différence entre la branche hello-cow et la branche hello-figlet, je peux le faire comme ceci :

$ git diff hello-cow hello-figlet 
diff --git a/hello.sh b/hello.sh
index e254fcb..0a9d994 100755
--- a/hello.sh
+++ b/hello.sh
@@ -2,9 +2,9 @@
 #
 # hello.sh
 
-if [ -x /usr/bin/cowsay ]
+if [ -x /usr/bin/figlet ]
 then
-  cowsay "Hello !"
+  figlet "Hello !"
 else
   echo "Hello !"
 fi

En y réfléchissant bien, à quoi revient la comparaison entre deux branches ? Dans le cas présent, git diff compare le dernier commit sur la branche hello-cow au dernier commit de la branche hello-figlet.

Exercice

  • Effectuez une copie du dépôt Git atelier-18 et nommez-la atelier-19.
  • Ajoutez la destination Budapest au fichier Roadtrip.md.
  • Ajoutez la carte routière Hongrie au fichier Cartes.md.
  • Affichez la différence entre l’index et le répertoire de travail.
  • Comment Git gère-t-il l’affichage des différences entre plusieurs fichiers ?
  • Ajoutez les fichiers modifiés à l’index.
  • Affichez la différence entre l’index et la base de données d’objets.
  • Validez les modifications.
  • Affichez l’historique du dépôt.
  • Visualisez les modifications effectuées dans le dernier commit.

Lire la suite : Rectifier le tir


La rédaction de cette documentation demande du temps et des quantités significatives de café espresso. Vous appréciez ce blog ? Offrez un café au rédacteur en cliquant sur la tasse.

 

Catégories : Formation

0 commentaire

Laisser un commentaire

Emplacement de l’avatar

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *