27. Git et les branches

Git est un formidable outil de suivi de version que j’utilise quotidiennement pour mes scripts (LaTeX, python, bash, …). Il n’est pas nécessaire de faire de la programmation pour l’utiliser. Je vais ici présenter la manière de réaliser un travail sur deux branches d’un script LaTeX versionné sous git.

La raison du passage sur une autre branche que « master » tient dans l’évolution du module « siunits » vers la version plus performante « siunitx ». Ces deux modules sont incompatibles, car la commande principale « \units{…}{…} » du premier a été remplacée par « \SI{…}{…} » dans le second. Or, le nombre d’occurrences de cette commande dans mon script étant important et des spécificités d’écritures propres au module « siunits » étant possibles, il était dangereux de travailler directement sur la branche « master ». On va donc créer une branche « unites », travailler sur celle-ci et quand toutes les modifications seront faites et que la compilation sera à nouveau fonctionnelle, on fusionnera les modifications faites dans la branche « unites » dans « master ».

Voici comment on peut procéder. Avant de créer une nouvelle branche, on vérifie qu’il n’existe que la branche master grâce à la commande :

git branch

qui devrait retourner « master » (en pressant sur Q on revient à l’invite de commande). On peut voir l’ensemble des branches avec leur dernier commit grâce à :

git branch -v

Avant le nom de la branche se trouve une étoile (*) qui montre la branche sur laquelle on se trouve actuellement.

On crée alors la nouvelle branche ainsi :

git branch unites

La commande « git branch » précédente retourne alors non seulement « master » mais aussi « unites ». La branche « master » reste cependant la branche de travail, comme le montre la présence de l’étoile devant celle-ci.

La branche « unites » est donc créée. Mais si on effectue des modifications sur les fichiers du dépôt, ces modifications seront reportées sur la branche « master ».

Pour changer de branches, il faut utiliser :

git checkout unites

La commande « git branch » présente alors une étoile devant la branche « unites ». On est sur la nouvelle branche.

On peut alors effectuer des modifications sur les fichiers du dépôt, comme par exemple, ajouter une ligne de commentaire : « % blabla » dans le fichier principal, main.tex par exemple.

Ensuite, on vérifie que les changements existent pour cette branche :

git status

Puis, on les ajoute pour le commit :

git add .

On effectue le commit :

git commit -m 'Ajout commentaire'

Et on verse ce commit au dépôt :

git push -u origin unites

et non :

git push -u origin master

puisque sur le dépôt « origin », on veut atteindre la branche « unites ».

Si maintenant, on veut revenir à la branche « master », il faut savoir qu’il est nécessaire d’avoir réalisé toutes les opérations de commit précédemment. Sans quoi le changement ne sera pas autorisé.


Et là on assiste à un miracle. Oui, oui, un miracle. Car en revenant à la branche « master » par :

git checkout master

et en éditant le fichier main.tex, on peut constater la disparition du commentaire.

Pour moi, c’est simplement fou, car cela signifie qu’en changeant de branche, l’ensemble des modifications réalisées sur la branche « unites » a été annulé. Toutes les modifications ont disparu. Et quand on retourne sur la branche « unites », le miracle continue, le commentaire réapparaît, ce qui signifie que toutes les modifications sont revenues.

On peut ainsi, sur la branche « unites » effectuer une compilation, qui peut bien ou mal se dérouler, quand on reviendra sur la branche « master », tous les fichiers issus de la compilation du main.tex de cette branche seront restaurés et une nouvelle compilation se déroulera correctement.

Il faut renouveler le WAHOO du miracle qui s’est accompli et évidemment les milliers de merci à tous les développeurs qui nous fournissent avec bienveillance cet outil formidable.


Après qu’une branche ait été créée, en n’oubliant pas de s’y placer par un checkout, on peut donc travailler en toute tranquillité sur celle-ci. Dans mon cas, j’ai remplacé le module siunits par siunitx dans un fichier contenant le préambule de mon fichier .tex principal. Puis, dans plein d’autres fichiers, j’ai du changer la commande LaTeX \unit{…}, propre au module siunits, par la commande \SI{…} propre au module siunitx. De plus, pour écrire un symbole d’unité pour l’ampère, par exemple, siunits permet \ampere, alors que siunitx demande \si{\ampere}. Enfin, les chiffres ne pouvant être notés comme \SI{10’000\cdot 10^3}{\metre}, par exemple, en raison du séparateur des milliers et du \cdot, il a fallu convertir cela en \SI{10000e3}{\metre} pour que la compilation fonctionne. Ce fut long.

Entre temps, je pouvais à loisir continuer de travailler sur la branche master pour avancer à la rédaction de mon cours. C’est incroyablement pratique.


Et enfin venu le moment où j’ai fini les modifications liées au module siunitx. Sur la branche unites, j’ai fait une dernière compilation pour vérifier que tout se passait bien et ai considéré la migration du module siunits vers siunitx comme terminée.

Il fallait maintenant fusionner les deux branches, ou plutôt, fusionner la branche unites dans la branche master. Pour ce faire, il faut d’abord de placer sur la branche dans laquelle la fusion doit être réalisée :

git checkout master

Puis, très simplement, faire la fusion :

git merge unites

En quelques secondes tout était prêt. Aucun conflit n’ayant été détecté, j’ai simplement compilé le fichier .tex principal de mon cours pour voir si tout avait bien fonctionné. Ce fut le cas. Tout les changements effectués sur la branche unites étaient passés dans la branche master et celle-ci compilait parfaitement.

Restait une dernière étape à réaliser. Comme aucun changement n’étaient plus à faire sur la branche unites, il fallait la supprimer :

git branch -d unites

Restait en fin à pousser tout cela sur le dépôt distant :

git status
git add .
git commit -m 'Fusion de la branche unites réalisée'
git push origin master

Ce fut une vraie partie de plaisir que je vous souhaite.

Laisser un commentaire