Voici 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
Le 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
Cette 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 | || ||
Si 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
- Basculez entre les trois branches de votre dépôt. À chaque fois, affichez le contenu de votre répertoire de travail. Que constatez-vous ?
- 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.
- 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.
0 commentaire