22/10/2024

Comprendre la notion de branches dans Git

De manière générale, ce n'est pas une bonne pratique de travailler sur la branche principale (« main », « master » ou autre ), à moins d'être le seul contributeur d'un dépôt Git. En fait, cette branche est plutôt considérée comme étant celle de référence, c'est-à-dire celle qui va contenir le code source prêt à être déployé en production. Pour s'assurer d'avoir une branche principale consistante, Git permet de faire du développement non-linéaire dans une ou plusieurs branches parallèles qui peuvent être fusionnées avec la branche principale lorsque le processus de développement est terminé.

Souvent, les nouvelles branches sont nommées « dev » ou « feature » pour le développement d'une nouvelle fonctionnalité à ajouter au code principal d'une application qui réside sur la branche « main » ou « master ». Une nouvelle branche pourrait aussi être créée pour quelqu'un qui fait de la documentation ou à des fins expérimentales. La création de branches parallèles permet notamment d'éviter les conflits dans les situations ou plusieurs contributeurs modifieraient le même fichier et tenteraient de l'inclure à la branche principale. Nous verrons plus loin qu'il est possible de mettre à jour son dépôt Git avant d'envoyer les modifications sur un dépôt partagé, ce qui réduit la possibilité d'avoir des conflits qui arrivent à l'occasion avec Git (nous y reviendrons plus bas).

Voyons maintenant comment créer une nouvelle branche nommée « feature » dans notre dépôt avec la commande « git branch ». Utilisée sans paramètre, cette commande permet de visualiser les branches d'un dépôt Git.

# Faire afficher les branches
$ git branch
* main

Comme nous n'avons pas créé de branche encore, la commande nous retourne « main » .

I. Créer une branche Git

Pour ajouter une branche, il faut indiquer le nom de celle-ci après la commande « git branch » :

# Créer une branche
$ git branch feature

Votre nouvelle branche « feature » est identique à « main » (ou « master ») : vous pouvez donc continuer à travailler sur le code déjà existant dans la branche de référence. Lorsque vous aurez terminé vos modifications, vous pourrez les fusionner avec la branche « main », ce qui est très pratique pour un projet de développement collectif.

Si vous exécutez « git branch » à nouveau, vous verrez que votre nouvelle branche a bien été créée :

# Faire afficher les branches
$ git branch
  feature
* main

L'astérisque indique la branche sur laquelle vous vous trouvez, c'est-à-dire « main ». Dans les illustrations qui suivent, le pointeur HEAD fait référence à la branche immédiatement au-dessus de lui : « master » (qui est l'équivalent de « main »). Ici, nous voyons que nous sommes sur « master » (ou « main ») et nous pouvons constater l'existence d'une autre branche nommée « feature » qui a été créé, dans cet exemple, au commit b6c836a.

Une branche est tout simplement un pointeur vers un commit spécifique dans un dépôt Git.

II. Premiers pas dans la gestion des branches Git

Pour se déplacer sur la branche « feature », il suffit d'utiliser la commande « git checkout » suivie du nom de la branche :

# Se déplacer sur une autre branche
$ git checkout feature

Switched to branch 'feature'

Si vous refaites la commande « git branch » ou « git status », vous verrez que vous êtes maintenant sur la branche « feature » :

# Faire afficher les branches : l'astérisque indique que nous sommes sur la branche "feature"
$ git branch
* feature
  main

# Voir la branche en cours avec git status
$ git status
On branch feature
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   README.md

Vous pouvez aussi créer une branche et vous déplacer automatiquement dessus avec la commande suivante :

git checkout -b <nom_de_la_branche>

Dans notre dernier exemple, le pointeur HEAD sera positionné sur la branche « feature », vis-à-vis du même commit que la branche principale parce que nous n'avons pas fait d'autres commits.

Si nous faisons de nouveaux commits, notre branche « feature » va continuer à avancer, alors que la branche « master » (ou « main ») va demeurer dans l'état du commit à partir duquel « feature » a été créée. Dans l'illustration suivante, trois nouveaux commits ont été faits sur la branche « feature » :

Voyons maintenant ce qui se passe si nous revenons à la branche « master » (ou « main ») avec la commande « git checkout » :

# Revenir à la branche "main"
$ git checkout main
Switched to branch 'main'

# Vérification avec git status
$ git status
On branch main

L'illustration suivante nous montre que le pointeur HEAD s'est déplacé sur le dernier commit de la branche « master » (ou « main »). Que va-t-il se passer si nous faisons un nouveau commit sur la branche principale ?

Nous voyons que l'historique de chaque branche commence à diverger à partir du commit f2c2b3b et les deux branches évoluent en parallèle. Cet exemple pourrait représenter une situation où des membres d'une équipe ont ajouté du contenu à la branche principale après que trois commits ont été faits sur « feature ».

Vous pouvez créer plusieurs branches dans un même dépôt de la même manière que nous l'avons indiqué plus haut. Elles peuvent être créées à partir de « master » (ou « main ») ou d'une autre branche. Par exemple, nous pourrions vouloir ajouter une nouvelle fonction à « feature » en créant une nouvelle branche « test » qui nous permettra de conserver le code de « feature » intact avant de l'intégrer.

L'exemple suivant montre qu'une branche « test » a été créée cette fois à partir de la branche « master » (ou « main ») au commit c3ff85b et deux autres commits ont été faits sur cette nouvelle branche. Le pointeur HEAD est situé sur la branche « feature », ce qui signifie qu'un checkout a été fait pour continuer à travailler sur « feature ».

III. Supprimer une branche Git

Pour supprimer une branche, dans notre cas « feature », vous devez vous déplacer sur la branche principale « master » (ou « main ») avant car Git ne vous permettra pas de scier la branche sur laquelle vous vous trouvez ! Après un « git checkout », vous pourrez supprimer la branche avec la commande « git branch -d <nom_de_la_branche> » :

# Se déplacer (faire un "checkout) sur une autre branche
$ git checkout main
Switched to branch 'main'

# Supprimer une branche
$ git branch -d feature
Deleted branch feature (was eb41526).

Attention, si vous êtes sur une branche secondaire et que vous tentez de supprimer la branche principale « master » (ou « main »), Git ne vous en empêchera pas. Bien que ce ne soit pas une manœuvre conventionnelle, vous pourriez vouloir poursuivre votre développement sur une autre branche.

Notons toutefois que, dans les exemples précédents, il ne serait pas justifié de supprimer une branche, à moins qu'il s'agisse de tests temporaires que nous ne souhaitons pas conserver sur la branche principale. Au contraire, nous risquons de vouloir fusionner nos changements avec la branche principale, comme nous allons le voir dans le prochain chapitre.

# Récapitulatif des commandes

git branch                   Créer une branche (suivi du nom de la branche) ou faire afficher les branches
git checkout <nom branche>   Se déplacer sur une branche
author avatar
Luc BRETON Administrateur système et cloud
Administrateur système et cloud avec une orientation DevOps pour une grande chaîne de pharmacies québécoise. Je suis plutôt généraliste avec une forte expérience côté virtualisation, stockage, cloud hybride et un intérêt particulier pour l'automatisation. J'aime le transfert de connaissances et il me fait plaisir d'être la première voix nord-américaine d'IT-Connect !
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.