GitVoici le huitième volet de la formation Git. Dans mon précédent article, nous avons illustré un problème qui peut survenir lorsque nous travaillons sur plusieurs idées en même temps. Aujourd’hui nous allons présenter une solution élégante à ce problème : les branches. Une fois que vous vous serez familiarisé avec leur fonctionnement grâce à un atelier pratique bien ficelé, vous les intégrerez régulièrement dans votre flux de travail.

Les branches par la pratique

Pour commencer, créez un répertoire formation-git/atelier-12/hello et initialisez un dépôt Git à l’intérieur de ce répertoire :

$ cd formation-git/
$ mkdir -pv atelier-12/hello
mkdir: created directory 'atelier-12'
mkdir: created directory 'atelier-12/hello'
$ cd atelier-12/hello/
$ git init
...
Initialized empty Git repository in /home/kikinovak/formation-git/atelier-12/hello/.git/

Créez un fichier hello.sh et éditez-le comme ceci :

#!/bin/bash
#
# hello.sh

echo "Hello !"

Rendez le fichier exécutable et lancez-le pour le fun :

$ chmod +x hello.sh
$ ./hello.sh
Hello !

Ajoutez le fichier à l’index de Git et validez-le :

$ git add hello.sh
$ git commit -m "Commit initial."
[master (root-commit) 3a500d8] Commit initial.
 1 file changed, 5 insertions(+)
 create mode 100755 hello.sh

À ce stade, vous vous dites que vous aimeriez bien avoir un affichage un peu plus enjoué. Vous voulez expérimenter un peu, mais sans toucher à votre script hello.sh qui fonctionne très bien en l’état.

Créez une nouvelle branche en utilisant la commande suivante :

$ git branch hello-cow

Invoquée sans autres arguments, la commande git branch affiche les branches existantes. Notez le petit astérisque * qui vous indique la branche sur laquelle vous vous trouvez :

$ git branch
  hello-cow
* master

Nous nous trouvons actuellement sur la branche master. La commande switch nous permet de changer de branche :

$ git switch hello-cow
Switched to branch 'hello-cow'
$ git branch
* hello-cow
  master

Créez un script hello-cow.sh et éditez-le comme ceci :

#!/bin/bash
#
# hello-cow.sh

if [ -x /usr/bin/cowsay ]
then
  cowsay "Hello !"
else
  echo "Hello !"
fi

ImportantLe script utilise la commande cowsay, un classique du monde Unix disponible dans toutes les distributions dignes de ce nom. Installez le paquet correspondant sur votre système avant d’aller plus loin.

Rendez le script exécutable et testez-le :

$ chmod +x hello-cow.sh
$ ./hello-cow.sh
 _________
< Hello ! >
 ---------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Ajoutez le script à Git et validez-le avec un message qui va bien :

$ git add hello-cow.sh
$ git commit -m "Premier jet de la vache qui dit bonjour."
[hello-cow 1e28dc8] Premier jet de la vache qui dit bonjour.
 1 file changed, 10 insertions(+)
 create mode 100755 hello-cow.sh

Rappelez-vous que nous sommes toujours dans la branche hello-cow :

$ git branch
* hello-cow
  master

Notre répertoire de travail contient deux fichiers :

$ ls
hello-cow.sh  hello.sh

Maintenant, revenons dans la branche master et affichons à nouveau le contenu du répertoire de travail :

$ git switch master
Switched to branch 'master'
$ ls
hello.sh

En basculant vers la branche master initiale, Git a « changé de disque » (si l’on peut dire) et en a profité pour réécrire le contenu de notre répertoire de travail.

À présent, j’ai une nouvelle idée pour un script, et là encore, je vais éviter de semer le bazar dans mon dépôt Git. Pour faire les choses proprement, je vais créer une nouvelle branche hello-figlet. Avant de faire cela, je m’assure de me trouver dans la branche master :

$ git branch
  hello-cow
* master
$ git branch hello-figlet
$ git branch
  hello-cow
  hello-figlet
* master

Je me positionne sur cette nouvelle branche :

$ git switch hello-figlet
Switched to branch 'hello-figlet'

J’édite un script hello-figlet.sh qui ressemble à ceci :

#!/bin/bash
#
# hello-figlet.sh

if [ -x /usr/bin/figlet ]
then
  figlet "Hello !"
else
  echo "Hello !"
fi

ImportantCette fois-ci, le bon fonctionnement du script dépend de la disponibilité de la commande figlet, un autre classique du monde Unix. Installez la commande avec les outils fournis par votre distribution.

Je rends le script exécutable et je le teste :

$ chmod +x hello-figlet.sh
$ ./hello-figlet.sh
 _   _      _ _         _
| | | | ___| | | ___   | |
| |_| |/ _ \ | |/ _ \  | |
|  _  |  __/ | | (_) | |_|
|_| |_|\___|_|_|\___/  (_)

J’ajoute le script à Git et je le valide avec un message approprié :

$ git add hello-figlet.sh
$ git commit -m "Premier jet avec des majuscules ASCII."
[hello-figlet f1482f4] Premier jet avec des majuscules ASCII.
 1 file changed, 10 insertions(+)
 create mode 100755 hello-figlet.sh

À ce stade, j’aimerais bien peaufiner mon script hello.sh initial. Pour les besoins de l’exercice, on va considérer que la branche master représente la « branche de production », si l’on peut dire.

Je me positionne dans la branche master :

$ git switch master
Switched to branch 'master'

J’édite le script hello.sh comme ceci :

#!/bin/bash
#
# hello.sh

echo
echo "Hello !"
echo

exit 0

Pour l’instant les modifications ne sont pas encore indexées :

$ 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:   hello.sh

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

Je les ajoute à l’index :

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

Et je valide avec un message approprié :

$ git commit -m "Peaufinage du script initial."
[master 9284ffb] Peaufinage du script initial.
 1 file changed, 4 insertions(+)

Tout ce travail avec les branches m’a bien fatigué, et je me dis que ça devrait se refléter dans mon code. En l’occurrence, j’aimerais que la vache qui dit bonjour ait l’air fatiguée. Rien de plus simple.

Je me positionne d’abord sur la branche appropriée :

$ git switch hello-cow
Switched to branch 'hello-cow'

J’édite le script hello-cow.sh comme ceci :

#!/bin/bash
#
# hello-cow.sh

if [ -x /usr/bin/cowsay ]
then
  cowsay -d "Hello !"
else
  echo "Hello !"
fi

Je teste mon script modifié :

$ ./hello-cow.sh
 _________
< Hello ! >
 ---------
        \   ^__^
         \  (xx)\_______
            (__)\       )\/\
             U  ||----w |
                ||     ||

AstuceSi vous voulez en savoir un peu plus sur les différentes expressions que peut arborer votre vache ASCII, jetez un œil dans la page de manuel en ligne man cowsay.

J’ajoute les modifications à l’index et je les valide avec un message qui va bien :

$ git add hello-cow.sh
$ git commit -m "Implémentation d'une vache fatiguée."
[hello-cow e8199f7] Implémentation d'une vache fatiguée.
 1 file changed, 1 insertion(+), 1 deletion(-)

Exercices

  1. Basculez entre les trois branches de votre dépôt. À chaque fois, affichez le contenu de votre répertoire de travail. Que constatez-vous ?
  2. Prenez une feuille de papier et essayez de représenter tous vos commits de manière graphique, en faisant apparaître les branches ainsi que les liens de parenté entre les commits. N’hésitez pas à déployer toute votre liberté artistique.
  3. Qu’est-ce qui se passerait si l’on combinait ces trois branches en une seule ? À quoi ressemblerait le répertoire de travail ? Combien de fichiers aurions-nous si nous pouvions intégrer les trois branches ci-dessus en une seule ?

Lire la suite : Le fast-forward merge


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

Avatar placeholder

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