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.

Icône de calendrier
Débutant
5 chapitres

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.

Schéma Git : workflow linéaire
Schéma Git : workflow linéaire

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.

Schéma Git : worflow avec branches
Schéma Git : worflow avec branches

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 :

  1. Une branche par fonctionnalité : Pour travailler sur une nouvelle fonctionnalité ou une amélioration spécifique. Branches authentification, menu
  2. 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
  3. Une branche par environnement : Pour séparer le code selon les environnements, comme dev, test et prod.
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 production
  • dev : 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 :

copié !
git branch

Vous avez la possibilité de visualiser l’ensemble des branches (locales et distantes en ajoutant le flag -a pour « all »).

copié !
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 :

  1. Elle démarre avec les mêmes commits que la branche d’origine.
  2. 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 :

copié !
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 :

copié !
git branch -m <ancien-nom> <nouveau-nom>

Il est également possible, et plus courant, de ne spécifier que le nouveau nom :

copié !
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 :

copié !
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 :

copié !
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 :

copié !
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. 👉