Afficher les modifications
Dans le précédente atelier pratique, 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 :
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 :
Je vais éditer ce fichier pour ajouter une destination :
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 diffaffiche la différence entre l'index et le répertoire de travail. -
Le fichier
a/Roadtrip.mdcorrespond à 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 diffnous affiche un extrait de quelques lignes avec un peu de contexte. -
Les arobases
@@symbolisent le début d'un tel extrait. -
7,3signifie que l'extrait en question commence à la ligne7et comporte3lignes.
À 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
À 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.
Différents chemins mènent à Saint-Bauzille-de-Putois
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 :
Si j'invoque git diff, je ne verrai rien :
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 :
Comme il faut s'y attendre, le contenu du répertoire de travail et de la zone d'indexation est identique :
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 :
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 :
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.
À vous de jouer !
-
Effectuez une copie du dépôt Git
atelier-18et 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.
