Voici 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 ligne7
et comporte3
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-laatelier-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.
0 commentaire