Git & GitHub : Organiser son Développement (Branches)
Les branches sont fondamentales puisqu'elles permettent d'organiser et d'isoler son travail dans des « lignes de développement » distinctes.
Introduction aux branches
Qu’est-ce qu’une branche ?
Dans Git, les branches sont des lignes de développement parallèles permettant aux développeurs de travailler de manière isolée sur des fonctionnalités ou des corrections de bugs sans perturber le code principal.
Par défaut, lorsque l’on initialise un dépôt local avec git init
, une branche nommée main
ou master
(selon la version de Git) est créée. C’est donc dans celle-ci que nous avons travaillé jusqu’à présent.
Concrètement une branche rassemble un historique de commits.
Le commit actif d’une branche est défini par le HEAD
(la tête) de cette dernière.
Par défaut, le HEAD
d’une branche pointe vers le dernier commit généré. Il est cependant possible de déplacer la tête vers un autre commit en faisant usage de la commande git reset <id-commit>
détaillée au chapitre précédent.
Workflow linéaire VS workflow avec branches
Contrairement au workflow linéaire, où toutes les modifications sont apportées sur une seule branche principale, Git permet de créer et de basculer entre différentes branches, ce qui facilite le développement collaboratif et la gestion des versions.
Les branches offrent ainsi plus de structure et de contrôle au développement.
Ici 2 branches parallèles authentification
et menu
ont été créées afin d’isoler de la branche principale main
le développement de fonctionnalités.
Cas d’usage
Il existe de nombreuses manières d’exploiter les branches Git. La plupart du temps, les développeurs créés :
- Une branche par fonctionnalité : Pour travailler sur une nouvelle fonctionnalité ou une amélioration spécifique. Branches
authentification
,menu
… - Une branche par utilisateur : Pour permettre à chaque développeur de travailler sur ses propres modifications sans interférer avec les autres. Branches
toto
,titi
,tutu
… - Une branche par environnement : Pour séparer le code selon les environnements, comme
dev
,test
etprod
.
Exemple de workflow classique avec les branches
De nombreux développeurs fonctionnent avec les branches de la manière suivante :
master
/main
: la branche principale utilisée pour la productiondev
: la branche utilisée pour le développement. C’est sur celle-ci que l’ensemble des développeurs vont pouvoir greffer leurs fonctionnalités, de sorte à tester l’application.- Les branches de fonctionnalités
feature-1
,feature-2
… : une branche est créée pour le développement d’une fonctionnalité bien spécifique, permettant ainsi de travailler de manière isolée.
Gérer ses branches
Visualiser ses branches
Commençons par visualiser les branches de notre dépôt avec la commande git branch
:
git branch
Vous avez la possibilité de visualiser l’ensemble des branches (locales et distantes en ajoutant le flag -a
pour « all »).
git branch -a
On obtient en sortie quelque chose comme cela :
- main
- dev
- *feature/feature1
- feature/feature2
- remotes/origin/main
- remotes/origin/dev
- remotes/origin/feature/feature1
- remotes/origin/feature/feature2
- Les branches locales apparaissent en blanc (ou vert avec un petit astérisque s’il s’agit de la branche active)
- Les branches distantes apparaissent en rouge
Créer une branche
Pour créer une branche, on tape la commande git branch
en y spécifiant le nom souhaité pour cette nouvelle branche :
git branch <nom-branche>
Si le nom de votre branche devait être constitué de plusieurs mots, on privilégiera alors la kebab-case. Exemples : new-feature
.
Si vous effectuez un git branch
à nouveau, vous verrez apparaître cette branche nouvellement créée.
Chaque branche possède son propre historique de commits. À chaque fois qu’une nouvelle branche est créée à partir d’une branche existante :
- Elle démarre avec les mêmes commits que la branche d’origine.
- Ensuite, lorsque des commits sont effectués sur cette nouvelle branche, ils sont enregistrés dans l’historique propre à cette branche.
Changer de branche
Pour changer de branche de développement, on exécute la commande git checkout
suivi du nom de la branche vers laquelle se déplacer :
git checkout <nom-branche>
Lorsqu’on change de branche :
- Le répertoire de travail (working directory) change pour correspondre à l’état de la branche vers laquelle vous basculez.
- La staging area n’est pas modifiée, elle conserve son état.
Si vous tapez git branch
à nouveau, vous verrez que la petite astérisque s’est déplacée sur la branche de destination, qui devient la branche active.
Renommer une branche
Pour renommer une branche, on exécute la commande git branch
avec le flag -m
:
git branch -m <ancien-nom> <nouveau-nom>
Il est également possible, et plus courant, de ne spécifier que le nouveau nom :
git branch -m <nouveau-nom>
Dans ce cas-là, Git va renommer la branche active.
Supprimer une branche
Pour supprimer une branche, on exécute la commande git branch
avec le flag -d
:
git branch -d <nom-branche>
Si la branche à supprimer n’a pas encore été fusionnée dans d’autres branches, Git nous mettra en garde de la perte potentielle de données en nous demandera d’écrire le flag -d
en majuscule afin de la supprimer de force :
git branch -D <nom-branche>
Fusionner des branches
La fusion de branches est le processus par lequel les modifications apportées à une branche sont intégrées à une autre branche. Fusionner 2 branches permet de combiner les modifications apportées dans chaque branche pour créer un commit unifié.
Le processus de fusion est récurrent lors de l’avancement sur un projet puisqu’il permet de greffer des fonctionnalités aux branches principales (main
, master
, dev
…) au fur et à mesure qu’elles sont implémentées.
La fusion de 2 branches est rendue possible avec la commande git merge
:
git merge <branche-a-fusionner>
Ici, la branche spécifiée sera fusionnée avec la branche active. On dit que la branche active, aussi appelée « branche source », reçoit la fusion.
- ✅ Si les modifications ne se chevauchent pas, la fusion se fait automatiquement et Git crée un nouveau commit aussi appelé « merge commit ».
- ⚠️ Si des modifications conflictuelles sont détectées, (c’est-à-dire que les deux branches ont modifié le même fichier de manière incompatible), Git les marquera dans le répertoire de travail et vous demande de les résoudre manuellement. C’est ce qu’on appelle la résolution de conflits. 👉