Développer des fonctionnalités en parallèle

Introduction aux branches

Que nous travaillions seul ou à plusieurs, il est un réflexe important à acquérir et qui consiste à isoler systématiquement chaque ensemble de développement.

Cet isolement se fait à l’aide des branches .

L’inconvénient que cela pose dans un workflow centralisé, c’est l’aspect mono-branche du dépôt partagé (souvent en SVN/CVS) qui rend difficile la parallélisation des tâches .

Admettons que nous ayons au sein d’une équipe des groupes de développeur·se·s travaillant chacun·e à un sous-ensemble fonctionnel du projet :

  • Estelle et Xavier sur feature-1 ,

  • Jonathan et Marie sur feature-2 .

Avec un dépôt central mono-branche unique, avoir une version stable à un instant donné relève de l’impossible, puisque quand feature-1 sera terminée, il est fort probable que feature-2 soit encore en cours de développement et donc pollue le projet, empêchant un déploiement en production.

../../../../_images/workflows_centralized.png

Workflow centralisé

En isolant alors le développement de chaque lot sur une branche dédiée, on s’assure que les lots rapatriés sur la branche centrale/de production (ici master) seront terminés. Ce principe est couramment appelé Feature Branching car il encourage la création d’une branche par fonctionnalité.

Création d’une branche feature-1

Création de la branche feature-1 par Estelle et partage via le dépôt distant.

1# création d'une branche feature-1 à partir de master
2git checkout -b feature-1 master
3# création de la branche sur le serveur distant
4# option courte : -u
5git push --set-upstream origin feature-1

Xavier récupère la nouvelle référence de branche pour pouvoir travailler dessus également

1git fetch origin
2git checkout feature-1
3# (développement de la tâche f1-X)
4git commit -am ‘Message concis décrivant f1-X’
5# (développement de la tâche f1-Y)
6git commit -am ‘Message concis décrivant f1-Y’
7# (une fois ses tâches terminées, en fin de journée ou quand le partage est nécessaire :)
8git push

Estelle et Xavier réalisent alors des tâches sur cette branche, déclinant au besoin des sous-branches sur leur poste/en local.

Testflow1 feature_1

Création d’une branche feature-2

En parallèle, Jonathan a également créé une branche locale. Il commence à travailler dessus et produit quelques commits avant de la partager sur le dépôt central pour que Marie puisse également y participer

1 # création d'une branche feature-2 à partir de master
2 git checkout -b feature-2 master
3 # (développement de la tâche f2-A)
4 git commit -am ‘Message concis décrivant f2-A’
5 # (partage à Estelle :)
6 git push --set-upstream origin feature-2 # option courte : -u

Marie récupère cette branche et y contribue.

1 git pull origin
2 git checkout feature-2
3 # (développement de la tâche f2-B)
4 git commit -am ‘Message concis décrivant f2-B’
../../../../_images/workflows_feature_branching.png

Workflow feature branching

Delicious insights merge avec l’option no-ff (no fast-forward)

Une fois le travail terminé par l’un des deux groupes, disons feature-2 par Marie et Jonathan, cette branche pourra être fusionnée sur sa branche de départ, à savoir master .

Marie se charge de ce travail.

1 git checkout master
2 git merge --no-ff feature-2
3 git push origin master

Note

l’option –no-ff force la conservation de la bosse de la branche feature-2 dans l’historique (à savoir son point de départ et d’arrivée depuis et dans master), à l’instar du fast-forward option par défaut (–ff). Cette option peut-être modifiée dans la configuration globale (git config –global merge.ff false) ou locale au projet (git config merge.ff false).

Delicious insights Suppression de la branche feature 2

Marie en profite également pour supprimer l’étiquette de branche locale et son équivalent distant (cela ne supprime pas l’historique, juste l’emplacement du nom de branche)

1 # Suppression de la branche distante feature-2
2 git push --delete origin feature-2
3 # # Suppression de la branche locale feature-2
4 git branch --delete feature-2

Testflow1 feature_2

Bien nommer ses branches

Pour ne pas nous perdre dans nos schémas de branches il est important de définir des conventions de nommage tout comme nous l’avions vu précédemment pour nos commits .

Chapitres précédent/suivant