Aller au contenu
Culture DevOps medium

Trunk-Based Development et modèles de branches Git

21 min de lecture

Le trunk based development est un modèle de gestion de branches où toute l'équipe intègre son travail sur une seule branche commune, plusieurs fois par jour, via des branches éphémères qui vivent moins d'une journée. Cette page explique ce modèle sans jargon, le compare aux autres stratégies de branching (GitFlow, GitHub Flow, GitLab Flow, Release Flow, OneFlow), et montre pourquoi il conditionne l'intégration continue et la livraison continue. Elle s'adresse aux équipes qui hésitent entre plusieurs conventions de branches et veulent choisir en connaissance de cause, chiffres DORA à l'appui.

  • Définir le trunk based development et le rôle des branches éphémères
  • Utiliser des feature flags pour livrer du code incomplet sans casser la production
  • Comparer GitFlow, GitHub Flow, GitLab Flow, Release Flow et OneFlow
  • Choisir un modèle adapté à la taille de votre équipe et à votre cadence de déploiement
  • Adopter le trunk based en pratique et désamorcer les objections classiques

Le trunk based development (développement basé sur le tronc) désigne une stratégie de branching où les développeurs collaborent sur une branche unique appelée trunk (souvent nommée main), en résistant à la tentation de créer des branches de développement qui durent. C'est la définition portée par le site de référence trunkbaseddevelopment.com, maintenu par Paul Hammant. L'idée centrale tient en une phrase : intégrer tôt et souvent plutôt que d'accumuler du code isolé pendant des semaines.

Ce modèle s'oppose frontalement aux approches où chaque fonctionnalité vit dans sa propre branche pendant des jours ou des semaines avant une fusion douloureuse. Prenons une équipe de six développeurs sur une API de facturation. En trunk based, chacun pousse son travail vers main au moins une fois par jour ; les conflits restent minuscules parce qu'ils portent sur quelques heures d'écart, pas sur trois semaines de divergence.

Graphe de branches du trunk based development : une seule branche main en bas et trois branches éphémères de moins d'un jour qui partent et fusionnent presque aussitôt

Une seule branche vivante, branches éphémères (< 1 jour), commits fréquents

Section intitulée « Une seule branche vivante, branches éphémères (< 1 jour), commits fréquents »

Le principe fondateur est qu'il n'existe qu'une seule branche longue durée : le trunk. Tout le reste est jetable. Sur une petite équipe, les développeurs peuvent même committer directement sur le trunk plusieurs fois par jour. Sur une équipe plus grande (le scaled trunk based development), on utilise de courtes branches éphémères (short-lived branches) : elles servent uniquement à la revue de code et à la vérification par l'intégration continue avant que le code n'atterrisse sur le trunk.

La règle de durée est explicite : une branche éphémère doit vivre moins d'un jour et fusionner dans le trunk au maximum toutes les 24 heures. Concrètement, un développeur qui ajoute un endpoint de remboursement crée une branche le matin, ouvre une Pull Request après deux ou trois commits, la fait valider par la CI et un collègue, puis la fusionne dans l'après-midi. La branche disparaît le jour même. On évite ainsi le merge hell, ce moment où fusionner une vieille branche demande de résoudre des dizaines de conflits accumulés.

Le rôle des feature flags pour intégrer du code incomplet sans casser la prod

Section intitulée « Le rôle des feature flags pour intégrer du code incomplet sans casser la prod »

La première objection au trunk based est évidente : comment fusionner une fonctionnalité à moitié terminée sans casser la production ? La réponse s'appelle le feature flag (drapeau de fonctionnalité, aussi nommé feature toggle). Un feature flag est un interrupteur logiciel qui active ou désactive un morceau de code sans redéployer l'application. On intègre le code sur le trunk, mais il reste éteint tant qu'il n'est pas complet.

Reprenons l'API de facturation. Vous développez un nouveau moteur de calcul de TVA sur plusieurs jours. Chaque bout de code part sur le trunk, mais entouré d'une condition du type if (featureFlags.nouveauCalculTVA). Comme le drapeau est à false en production, les utilisateurs ne voient rien. Le jour où le moteur est prêt et testé, vous basculez le flag à true, progressivement, pour un pourcentage d'utilisateurs. Le code était déjà en production depuis longtemps, seule son activation change. Cette technique, combinée au branch by abstraction (introduire une couche d'abstraction pour remplacer un composant en douceur), rend possible l'intégration continue sans branches longues.

Pourquoi c'est un prérequis de l'intégration continue (lien DORA, équipes élites)

Section intitulée « Pourquoi c'est un prérequis de l'intégration continue (lien DORA, équipes élites) »

Le trunk based n'est pas une préférence esthétique : c'est la condition technique de l'intégration continue. La définition rigoureuse de la CI, portée par les recherches DORA (DevOps Research and Assessment, le programme de recherche derrière le rapport State of DevOps), est précise : la CI, c'est pratiquer le trunk based development et maintenir une suite de tests automatisés rapides qui s'exécutent après chaque commit sur le trunk. Sans tronc commun régulièrement mis à jour, il n'y a rien à intégrer en continu.

Les chiffres du programme DORA sont sans ambiguïté. Les équipes élite qui atteignent leurs objectifs de fiabilité sont 2,3 fois plus susceptibles de pratiquer le trunk based development, et 5,8 fois plus susceptibles de s'appuyer sur l'intégration continue. Le trunk based alimente directement les métriques DORA : plus les branches sont courtes, plus la fréquence de déploiement monte et plus le délai de livraison baisse. C'est le socle sur lequel repose ensuite la livraison continue, puis le déploiement continu.

Comparaison visuelle Trunk-Based Development contre GitFlow : à gauche une branche main unique avec de courtes branches de moins d'un jour, à droite cinq branches longues empilées avec des merges complexes

Il n'existe pas de modèle universel. Le bon choix dépend de votre cadence de déploiement, de la taille de l'équipe et de la nécessité ou non de maintenir plusieurs versions en parallèle. Cette section détaille les grands modèles, du plus lourd au plus léger, pour situer le trunk based dans le paysage. Pour la mise en œuvre côté outil Git, la page workflows Git complète cette lecture stratégique.

GitFlow (Vincent Driessen) : master/develop/feature/release/hotfix, et pourquoi il freine le déploiement continu

Section intitulée « GitFlow (Vincent Driessen) : master/develop/feature/release/hotfix, et pourquoi il freine le déploiement continu »

GitFlow est le modèle publié par Vincent Driessen en 2010 dans l'article A successful Git branching model. Il repose sur deux branches permanentes, master (l'état en production) et develop (l'intégration en cours), et trois familles de branches de support : les branches feature (une par fonctionnalité, issues de develop), les branches release (préparation d'une version) et les branches hotfix (correctifs urgents partant de master). C'est un modèle riche et cadré, pensé pour du logiciel explicitement versionné.

Le problème, c'est justement sa richesse. Avec des branches feature qui peuvent vivre longtemps et un aller-retour develop vers release vers master, GitFlow multiplie les branches longue durée et les étapes manuelles. Il freine mécaniquement le déploiement continu. Driessen lui-même a ajouté en 2020 une note en tête de son article : si votre équipe fait de la livraison continue, adoptez un workflow beaucoup plus simple. Il précise que GitFlow reste pertinent pour du logiciel dont on maintient plusieurs versions dans la nature (une bibliothèque, un outil installé chez des clients), mais pas pour une application web déployée en continu.

Graphe de branches de GitFlow : cinq branches (master, develop, feature, release, hotfix) longues, empilées, reliées par des merges croisés

GitHub Flow : main + branches de feature courtes + Pull Request + déploiement depuis main

Section intitulée « GitHub Flow : main + branches de feature courtes + Pull Request + déploiement depuis main »

GitHub Flow est une simplification radicale. Une seule branche permanente, main, toujours déployable. Pour toute modification, on crée une branche de feature courte, on ouvre une Pull Request, on la fait relire, on la fusionne dans main, puis on déploie depuis main. Il n'y a ni branche develop, ni branche release. C'est le modèle que Driessen recommande implicitement quand il parle de workflow simple.

GitHub Flow est très proche du trunk based, avec une nuance : les branches de feature peuvent y vivre un peu plus longtemps que la limite stricte de 24 heures du trunk based. Pour une équipe qui livre une application SaaS plusieurs fois par semaine, GitHub Flow est souvent le point d'entrée idéal : peu de cérémonie, une PR par changement, un déploiement depuis main.

Graphe de branches de GitHub Flow : la branche main et de courtes branches de feature qui passent par une Pull Request avant de fusionner, puis un déploiement depuis main

GitLab Flow : GitHub Flow + branches d'environnement (pré-prod, prod) ou de release

Section intitulée « GitLab Flow : GitHub Flow + branches d'environnement (pré-prod, prod) ou de release »

GitLab Flow part de GitHub Flow et ajoute une notion absente : les branches d'environnement. La différence majeure entre les deux, c'est que GitLab Flow introduit des branches comme pre-production et production. Le code circule de main vers pre-production, puis de pre-production vers production, ce qui matérialise le passage par des environnements successifs avant d'atteindre les utilisateurs.

Ce modèle répond à un cas concret : toutes les équipes ne peuvent pas déployer en production à chaque fusion sur main. Une plateforme bancaire qui exige une validation en recette avant la mise en production trouvera dans les branches d'environnement une représentation fidèle de son processus. GitLab Flow autorise aussi, en option, des branches de release pour les projets versionnés, avec la règle de n'y porter que des corrections majeures. Cette logique de promotion se rapproche des approches GitOps, où l'état souhaité de chaque environnement est décrit dans Git.

Graphe de branches de GitLab Flow : une branche main alimentée par une feature, puis des branches d'environnement pre-production et production reliées par des flèches de promotion successives

Release Flow (Microsoft) : trunk-based avec branches de release en lecture

Section intitulée « Release Flow (Microsoft) : trunk-based avec branches de release en lecture »

Release Flow est la variante de trunk based utilisée par les équipes de Microsoft (notamment Azure DevOps), décrite sur le blog DevOps de Microsoft. Le quotidien est purement trunk based : pour corriger un bug ou ajouter une fonctionnalité, on crée une topic branch courte depuis la branche d'intégration principale, on ouvre une Pull Request, elle passe les politiques de build et la revue, puis fusionne dans le trunk. Travailler depuis une seule branche principale élimine quasiment la dette de fusion.

La spécificité tient à la release. À la fin de chaque sprint, l'équipe crée une branche de release figée, par exemple releases/M129. Cette branche sert de photographie de la version livrée ; on n'y développe pas. Les correctifs urgents sont d'abord fusionnés sur le trunk, puis cherry-pickés (report sélectif d'un commit précis) vers la branche de release concernée. On combine ainsi la vitesse du trunk based et la traçabilité de versions figées pour un produit déployé à grande échelle.

Graphe de branches de Release Flow : un trunk trunk-based avec de courtes topic branches et une branche de release figée en lecture, alimentée par un cherry-pick depuis le trunk

OneFlow, proposé par Adam Ruka en 2017, se présente comme une alternative simplifiée à GitFlow sans rien perdre de son expressivité. Sa prémisse : conserver une seule branche éternelle dans le dépôt, au lieu du couple master plus develop de GitFlow. Les cas avancés (retrouver une version passée, gérer un correctif sur une ancienne release) sont couverts par les tags Git plutôt que par des branches permanentes supplémentaires.

OneFlow autorise les mêmes branches de support que GitFlow (feature, release, hotfix), mais insiste sur leur caractère court et jetable : elles servent surtout à partager du code et à servir de sauvegarde. Pour une équipe attachée au cadre de GitFlow mais lassée de la complexité de deux branches permanentes, OneFlow offre un compromis : moins de branches longues, un schéma de versionnage plus simple, tout en restant loin de la discipline stricte du trunk based.

Graphe de branches de OneFlow : une seule branche permanente master et une branche de feature courte rebasée sur master avant sa fusion, sans branche develop

Le Forking Workflow est la stratégie des projets open source hébergés sur des plateformes comme GitHub ou GitLab. Ici, chaque contributeur ne pousse pas sur le dépôt central : il en crée une copie personnelle (un fork), travaille dessus, puis propose ses changements au projet d'origine via une Pull Request entre dépôts. Le mainteneur du projet garde ainsi un contrôle total sur ce qui entre dans le dépôt officiel.

Ce modèle brille quand des contributeurs non fiables ou externes doivent pouvoir proposer du code sans avoir de droit d'écriture sur le dépôt principal. Un projet comme le noyau Linux ou une bibliothèque npm populaire reçoit des centaines de contributions d'inconnus : le fork est la barrière naturelle. En entreprise, sur une équipe soudée avec droit d'écriture partagé, ce niveau d'isolement est généralement superflu et ralentit le rythme.

Graphe de branches du Forking Workflow : un dépôt upstream officiel et le fork personnel du contributeur, avec la création du fork puis une Pull Request de retour vers l'upstream

Ship / Show / Ask : quand merger direct, ouvrir une PR pour info, ou demander une revue

Section intitulée « Ship / Show / Ask : quand merger direct, ouvrir une PR pour info, ou demander une revue »

Ship / Show / Ask est une stratégie formulée par Rouan Wilsenach, publiée sur le site de Martin Fowler. Elle ne remplace pas les modèles précédents : elle répond à une question tactique du trunk based, faut-il une revue pour ce changement précis ? Elle classe chaque modification en trois catégories selon le niveau de contrôle nécessaire.

En mode Ship, on fusionne directement sur la branche principale sans revue : c'est l'esprit pur de l'intégration continue, réservé aux changements à faible risque (correction de faute, ajustement de log). En mode Show, on ouvre une Pull Request puis on la fusionne immédiatement, sans attendre de retour humain, pour rendre le changement visible et discutable a posteriori. En mode Ask, on ouvre une PR et on attend un retour avant de fusionner, pour les changements incertains ou structurants. Cette gradation évite le piège de la revue systématique qui ralentit tout, y compris les changements triviaux.

Trois chemins côte à côte pour Ship, Show et Ask : Ship fusionne directement sans revue, Show ouvre une Pull Request pour information puis fusionne aussitôt, Ask ouvre une Pull Request et attend la revue avant de fusionner

Ce tableau résume les modèles selon quatre critères décisifs. La durée de vie des branches est le meilleur prédicteur de compatibilité avec la livraison continue : plus elle est courte, plus le modèle est adapté à un déploiement fréquent. Lisez-le comme une aide au choix, pas comme un classement de qualité : chaque modèle a son terrain.

ModèleDurée de vie des branchesAdapté au CDTaille d'équipeComplexité
Trunk-Based Development< 1 jourExcellentToute tailleFaible mais discipline forte
GitHub FlowQuelques joursTrès bonPetite à moyenneFaible
GitLab FlowQuelques jours + environnementsTrès bonMoyenne à grandeMoyenne
Release Flow< 1 jour + releases figéesTrès bonGrandeMoyenne
OneFlowJours à semainesMoyenMoyenneMoyenne
GitFlowSemainesFaibleMoyenne à grande, produit versionnéÉlevée
Forking WorkflowVariableMoyenOpen source, contributeurs externesMoyenne

Passer au trunk based ne se décrète pas : c'est un ensemble de pratiques techniques qui se renforcent. Sans elles, intégrer plusieurs fois par jour devient dangereux. La bascule réussit quand les garde-fous automatisés sont en place avant de raccourcir les branches, pas après.

  1. Revue continue et branches courtes. Adoptez des Pull Requests de petite taille, relues en quelques heures. Une PR de 40 lignes se relit ; une PR de 2000 lignes se survole. Ship / Show / Ask aide à calibrer le niveau de revue par changement.

  2. CI rapide. La suite de tests doit tourner en quelques minutes, sinon personne n'intègre plusieurs fois par jour. Une CI de 45 minutes tue le trunk based. Parallélisez, mettez en cache, découpez les étapes.

  3. Tests automatisés fiables. Chaque commit sur le trunk déclenche des tests automatisés qui garantissent que le système fonctionne toujours. Sans filet de tests, intégrer souvent revient à casser souvent.

  4. Feature flags. Équipez-vous d'un système de feature flags pour livrer du code incomplet, activer progressivement et désactiver en cas d'incident sans redéployer.

Une fois ces fondations posées, le trunk based devient un accélérateur naturel. Il s'accorde avec les stratégies de déploiement progressif comme les rolling updates et rollbacks sous Kubernetes, où l'on active une nouvelle version par vagues et où l'on revient en arrière sans drame si un feature flag ou une métrique dérape.

L'objection la plus fréquente concerne la revue de code : si on intègre plusieurs fois par jour, ne sacrifie-t-on pas la relecture ? Non. Le trunk based ne supprime pas la revue, il la raccourcit et la déplace. Les branches éphémères passent en Pull Request, mais la petite taille des changements rend la revue rapide. Ship / Show / Ask permet même de moduler : revue systématique pour le code sensible, intégration directe pour le trivial.

La deuxième crainte porte sur la qualité. Intégrer vite ferait-il baisser la qualité ? Les données DORA disent l'inverse : les équipes en trunk based ont un taux d'échec des changements plus bas, parce que les petits lots sont plus faciles à tester, à comprendre et à annuler. Un changement de 30 lignes qui casse la production se diagnostique en minutes ; une fusion de trois semaines qui casse la production se diagnostique en jours.

La troisième objection vise les équipes distribuées sur plusieurs fuseaux horaires. La réponse est double : d'abord une documentation solide, car les recherches DORA montrent que le trunk based contribue bien davantage à la performance quand la documentation est bonne ; ensuite les feature flags, qui découplent l'intégration du code de son activation, ce qui réduit le besoin de coordination synchrone entre continents.

  • Le trunk based development repose sur une seule branche vivante et des branches éphémères de moins d'un jour.
  • Les feature flags permettent d'intégrer du code incomplet sans jamais casser la production.
  • C'est le prérequis technique de l'intégration continue : pas de trunk commun, pas de CI réelle.
  • Les équipes élite DORA sont 2,3 fois plus susceptibles de le pratiquer et maintiennent 3 branches actives ou moins.
  • GitFlow convient au logiciel versionné mais freine le déploiement continu ; son auteur recommande un modèle plus simple pour la livraison continue.
  • GitHub Flow et GitLab Flow sont des points d'entrée accessibles ; Release Flow et OneFlow répondent à des besoins de versionnage.
  • La bonne pratique se choisit selon la cadence de déploiement, la taille d'équipe et le besoin de maintenir plusieurs versions.
  • Adopter le trunk based exige d'abord une CI rapide, des tests fiables et des PR courtes, sinon la qualité chute.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn