A place to cache linked articles (think custom and personal wayback machine)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

пре 5 година
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. title: Développer efficacement avec Git
  2. url: http://www.occitech.fr/blog/2014/12/un-modele-de-branches-git-efficace/
  3. hash_url: 7dfecff06cb91feccce15d23301c09e8
  4. <p><em>NdT : Depuis 2 ans, notre équipe utilise <a href="https://github.com/nvie/gitflow">Gitflow</a>, un modèle de développement simple, documenté dans cet article. Cette convention facilite entre autres le déploiement continu. Nous vous encourageons à l’adopter à votre tour.</em></p>
  5. <p><em>Nous avons donc traduit <a href="http://nvie.com/posts/a-successful-git-branching-model/">l’article original</a> de Vincent Driessen à destination des équipes agiles francophones.</em></p>
  6. <p>Dans cet article je présente le modèle de développement que j’ai commencé à utiliser pour tous mes projets (professionnels et personnels) depuis 1 an, et qui s’est avéré être très efficace. Cela fait un moment que je voulais écrire à son propos, mais je n’avais pas vraiment tout à fait pris le temps de le faire, jusqu’à maintenant. Je ne vais pas parler des détails des projets, simplement de la stratégie de ramification des branches et de la gestion des versions.</p>
  7. <p><img src="http://nvie.com/img/git-model@2x.png" alt="modèle de branches Git"/></p>
  8. <p>C’est axé autour de Git comme outil de versionnement pour tout le code source.</p>
  9. <h2>Pourquoi Git ?</h2>
  10. <p>Pour une discussion approfondie sur les avantages et les inconvénients de Git comparé à des systèmes centralisés de contrôle du code source, <a href="http://www.whygitisbetterthanx.com">regardez</a> sur le <a href="https://git.wiki.kernel.org/index.php/GitSvnComparsion">web</a>. Il y a plein d’échanges de points de vue qui continuent sur le web.</p>
  11. <p>En tant que développeur, je préfère Git à tous les autres outils qui existent aujourd’hui. Git a vraiment changé la manière dont les développeurs pensent la fusion et la bifurcation de branche. Dans le monde des classiques CVS/ Subversion d’où je viens, fusionner/ramifier a toujours été considéré comme quelque chose d’un peu effrayant (attention aux conflits après une fusion, ils mordent !) et c’est une opération qu’on ne fait que de temps à autre.</p>
  12. <p>Mais avec Git, ces opérations sont très peu coûteuses et très simples et elles sont vraiment considérées comme partie intégrante de votre manière de travailler au quotidien. Par exemple dans les <a href="http://svnbook.red-bean.com">livres</a> sur CVS/Subversion, la création de branche et la fusion ne sont évoquées que dans les derniers chapitres (pour les utilisateurs avancés), alors que dans <a href="https://pragprog.com/book/tsgit/pragmatic-version-control-using-git">n’importe quel livre sur Git</a>, c’est un sujet couvert dès le chapitre 3 (les bases).</p>
  13. <p>Grâce à sa simplicité et à sa nature répétitive, la bifurcation et la fusion ne sont plus une opération à redouter. Les outils de contrôle de version sont avant tout supposés aider dans la bifurcation/fusion.</p>
  14. <p>Assez parlé des outils, voyons maintenant le modèle de développement. Le modèle que je présente ici n’est rien d’autre qu’un ensemble de procédures que chaque membre de l’équipe doit respecter pour parvenir à un processus de gestion de développement logiciel.</p>
  15. <h2>Décentralisé mais centralisé</h2>
  16. <p>La configuration de dépôt que nous utilisons et qui marche bien avec ce modèle de développement, est celle avec un « vrai » dépôt central. Notez que ce dépôt est simplement <em>considéré</em> comme étant le dépôt central (puisque Git est un système de version décentralisé, techniquement il n’existe pas de dépôt central en tant que tel.). Nous ferons référence à ce dépôt comme &#13;
  17. <span id="crayon-5524f18329960220084663" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">origin</span></span></span>, puisque tous les utilisateurs de Git sont familiers avec ce nom.</p>
  18. <p><img src="http://nvie.com/img/centr-decentr@2x.png" alt="Des dépôts centralisés et un dépôt central"/></p>
  19. <p>Chaque développeur &#13;
  20. <span id="crayon-5524f1832996a951613731" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">pull</span></span></span> et &#13;
  21. <span id="crayon-5524f1832996d933763346" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">push</span></span></span> sur &#13;
  22. <span id="crayon-5524f18329971850647940" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">origin</span></span></span>. Mais au delà de la relation centralisée push-pull, chaque développeur peut aussi récupérer des changements d’autres équipiers et ainsi former des sous-équipes. Par exemple, cela peut s’avérer utile quand deux ou plusieurs développeurs travaillent ensemble sur une fonctionnalité, plutôt que de pousser prématurément le travail en cours sur &#13;
  23. <span id="crayon-5524f18329974202447255" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">origin</span></span></span>. Dans l’illustration ci-dessus, il y a des sous-équipes d’Alice et Bob, Alice et David et Claire et David.</p>
  24. <p>Techniquement, cela veut simplement dire qu’Alice a défini un dépôt distant, nommé &#13;
  25. <span id="crayon-5524f18329977827858655" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">bob</span></span></span>, qui pointe vers le dépôt de Bob et inversement.</p>
  26. <h2>Les branches principales</h2>
  27. <p>À la base, ce modèle de développement s’inspire fortement de modèles existants. Le dépôt central héberge les deux branches principales qui ont une durée de vie infinie :</p>
  28. <p>La branche &#13;
  29. <span id="crayon-5524f18329981433630635" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">master</span></span></span> sur &#13;
  30. <span id="crayon-5524f18329983132954111" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">origin</span></span></span> devrait être connue des utilisateurs de Git. Parallèlement à la branche &#13;
  31. <span id="crayon-5524f18329986929081415" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">master</span></span></span>, une autre branche appelée &#13;
  32. <span id="crayon-5524f18329989667513460" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span> est présente.</p>
  33. <p>Nous considérons &#13;
  34. <span id="crayon-5524f1832998c094138297" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">origin</span><span class="crayon-o">/</span><span class="crayon-i">master</span></span></span> comme étant la branche principale où le code source de &#13;
  35. <span id="crayon-5524f18329990621208088" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-cn">HEAD</span></span></span> reflète l’état de <em>prêt pour être déployé en production</em>.</p>
  36. <p>Nous considérons &#13;
  37. <span id="crayon-5524f18329993395315804" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">origin</span><span class="crayon-o">/</span><span class="crayon-i">develop</span></span></span> comme étant la branche principale où le code source de &#13;
  38. <span id="crayon-5524f18329996971374370" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-cn">HEAD</span></span></span> reflète les derniers changements livrés pour la prochaine version. Certains l’appelleraient « branche d’intégration ». C’est à partir de cet emplacement que sont compilées les versions quotidiennes.</p>
  39. <p>Quand le code source dans la branche &#13;
  40. <span id="crayon-5524f18329999187104857" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span> est considéré stable et prête à être livré, tous les changements doivent être fusionnés dans &#13;
  41. <span id="crayon-5524f1832999c838494319" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">master</span></span></span> puis se voient assignés d’un numéro de version. Nous verrons comment faire cela en détails plus loin.</p>
  42. <p>En conséquence, à chaque fois que des changements sont reportés dans &#13;
  43. <span id="crayon-5524f1832999f954198507" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">master</span></span></span>, <em>par définition</em> c’est une nouvelle version de production. Nous devons être très strict avec ceci, pour qu’hypothétiquement nous puissions utiliser un hook Git afin de compiler et déployer automatiquement notre logiciel sur nos serveurs de production à chaque fois qu’il y a un commit sur &#13;
  44. <span id="crayon-5524f183299a2504499913" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">master</span></span></span>.</p>
  45. <h2>Les branches de support</h2>
  46. <p>A côté des branches principales &#13;
  47. <span id="crayon-5524f183299a5711933447" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">master</span></span></span> et &#13;
  48. <span id="crayon-5524f183299a8210986753" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span>, notre modèle de développement utilise une variété de branches de support pour aider le développement en parallèle entre les membres de l’équipe, faciliter le suivi des fonctionnalités, préparer les versions de productions et nous aider à réparer rapidement les problèmes survenus en production.<br/>
  49. Contrairement aux branches principales, ces branches ont toujours une durée de vie limitée, puisqu’elles seront effacées au final.</p>
  50. <p>Les différents types de branches que nous pouvons utiliser sont :</p>
  51. <ul>
  52. <li>les branches pour les fonctionnalités</li>
  53. <li>les branches pour les versions</li>
  54. <li>les branches de correctifs</li>
  55. </ul>
  56. <p>Chacune de ces branches a un but précis et elles obéissent à des règles strictes comme de quelles branches elles peuvent provenir et dans quelles branches elles peuvent être fusionnées. Nous allons voir comment dans quelques minutes.</p>
  57. <p>Ce ne sont en aucun cas des branches « spéciales » d’un point de vue technique. Les types de branche sont catégorisés par la façon dont nous les <em>utilisons</em>. Ce sont bien sûr de bonnes vieilles branches Git.</p>
  58. <h2>Les branches de fonctionnalité</h2>
  59. <dl>
  60. <dt>Peuvent provenir de :</dt>
  61. <dd>&#13;
  62. <span id="crayon-5524f183299ac643994389" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span></dd>
  63. <dt>Doivent être fusionnées dans :</dt>
  64. <dd>&#13;
  65. <span id="crayon-5524f183299af497600238" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span></dd>
  66. <dt>Convention de nommage de la branche :</dt>
  67. <dd>Tout sauf &#13;
  68. <span id="crayon-5524f183299b2244283822" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">master</span></span></span>, &#13;
  69. <span id="crayon-5524f183299b5685611838" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span>, &#13;
  70. <span id="crayon-5524f183299b8798246908" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">release</span><span class="crayon-o">-</span><span class="crayon-o">*</span></span></span> ou &#13;
  71. <span id="crayon-5524f183299bb271658553" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">hotfix</span><span class="crayon-o">-</span><span class="crayon-o">*</span></span></span>.</dd>
  72. </dl>
  73. <p>Les branches de fonctionnalités (parfois appelées branches de thème) sont utilisées pour développer de nouvelles fonctionnalités pour la prochaine version ou pour une future. Au début du développement d’une fonctionnalité, la version cible dans laquelle cette fonctionnalité sera ajoutée peut très bien être inconnue à cet instant. La raison d’être d’une branche de fonctionnalité est qu’elle existe tant que la fonctionnalité est en cours de développement, mais sera finalement fusionnée dans &#13;
  74. <span id="crayon-5524f183299be125860865" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span> (pour ajouter la fonctionnalité à la prochaine version) ou abandonnée (dans le cas d’une expérience décevante).</p>
  75. <p>Les branches de fonctionnalités n’existent typiquement que dans les dépôts des développeurs, pas sur &#13;
  76. <span id="crayon-5524f183299c1038681621" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">origin</span></span></span>.</p>
  77. <h3>Créer une branche de fonctionnalité</h3>
  78. <p>Lorsque vous commencee à travailler sur une nouvelle fonctionnalité, partez de la branche &#13;
  79. <span id="crayon-5524f183299c5094065692" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span>
  80. </p>&#13;
  81. &#13;
  82. <div id="crayon-5524f183299c8700863381" class="crayon-syntax crayon-theme-github crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">&#13;
  83. &#13;
  84. &#13;
  85. <p class="crayon-info"/>&#13;
  86. <p class="crayon-plain-wrap"/>&#13;
  87. <div class="crayon-main">&#13;
  88. <table class="crayon-table">&#13;
  89. <tr class="crayon-row">&#13;
  90. <td class="crayon-nums " data-settings="show">&#13;
  91. &#13;
  92. </td>&#13;
  93. <td class="crayon-code"><div class="crayon-pre"><p class="crayon-line" id="crayon-5524f183299c8700863381-1"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-i">checkout</span><span class="crayon-h"> </span><span class="crayon-o">-</span><span class="crayon-i">b</span><span class="crayon-h"> </span><span class="crayon-e">myfeature </span><span class="crayon-e">develop</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f183299c8700863381-2"><span class="crayon-e">Switched </span><span class="crayon-st">to</span><span class="crayon-h"> </span><span class="crayon-i">a</span><span class="crayon-h"> </span><span class="crayon-r">new</span><span class="crayon-h"> </span><span class="crayon-i">branch</span><span class="crayon-h"> </span><span class="crayon-s">"myfeature"</span></p></div></td>&#13;
  94. </tr>&#13;
  95. </table>&#13;
  96. </div>&#13;
  97. </div>&#13;
  98. &#13;
  99. <p>
  100. </p><h3>Incorporer une fonctionnalité terminée dans develop</h3>
  101. <p>Les fonctionnalités terminées peuvent être fusionnées dans la branche &#13;
  102. <span id="crayon-5524f183299cb046223666" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span> pour être ajoutées à la prochaine version :</p>
  103. &#13;
  104. &#13;
  105. <div id="crayon-5524f183299ce356317238" class="crayon-syntax crayon-theme-github crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">&#13;
  106. &#13;
  107. &#13;
  108. <p class="crayon-info"/>&#13;
  109. <p class="crayon-plain-wrap"/>&#13;
  110. <div class="crayon-main">&#13;
  111. <table class="crayon-table">&#13;
  112. <tr class="crayon-row">&#13;
  113. <td class="crayon-nums " data-settings="show">&#13;
  114. &#13;
  115. </td>&#13;
  116. <td class="crayon-code"><div class="crayon-pre"><p class="crayon-line" id="crayon-5524f183299ce356317238-1"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-e">checkout </span><span class="crayon-e">develop</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f183299ce356317238-2"><span class="crayon-e">Switched </span><span class="crayon-st">to</span><span class="crayon-h"> </span><span class="crayon-i">branch</span><span class="crayon-h"> </span><span class="crayon-s">'develop'</span></p><p class="crayon-line" id="crayon-5524f183299ce356317238-3"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-i">merge</span><span class="crayon-h"> </span><span class="crayon-o">--</span><span class="crayon-i">no</span><span class="crayon-o">-</span><span class="crayon-e">ff </span><span class="crayon-e">myfeature</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f183299ce356317238-4"><span class="crayon-e">Updating </span><span class="crayon-i">ea1b82a</span><span class="crayon-sy">.</span><span class="crayon-sy">.</span><span class="crayon-cn">05e9557</span></p><p class="crayon-line" id="crayon-5524f183299ce356317238-5"><span class="crayon-sy">(</span><span class="crayon-cn">R</span>é<span class="crayon-i">sum</span>é<span class="crayon-h"> </span><span class="crayon-e">des </span><span class="crayon-i">changements</span><span class="crayon-sy">)</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f183299ce356317238-6"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-i">branch</span><span class="crayon-h"> </span><span class="crayon-o">-</span><span class="crayon-i">d</span><span class="crayon-h"> </span><span class="crayon-e">myfeature</span></p><p class="crayon-line" id="crayon-5524f183299ce356317238-7"><span class="crayon-e">Deleted </span><span class="crayon-e">branch </span><span class="crayon-e">myfeature</span><span class="crayon-h"> </span><span class="crayon-sy">(</span><span class="crayon-i">was</span><span class="crayon-h"> </span><span class="crayon-cn">05e9557</span><span class="crayon-sy">)</span><span class="crayon-sy">.</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f183299ce356317238-8"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-e">push </span><span class="crayon-e">origin </span><span class="crayon-i">develop</span></p></div></td>&#13;
  117. </tr>&#13;
  118. </table>&#13;
  119. </div>&#13;
  120. </div>&#13;
  121. &#13;
  122. <p>L’option &#13;
  123. <span id="crayon-5524f183299d1207435428" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-o">--</span><span class="crayon-i">no</span><span class="crayon-o">-</span><span class="crayon-i">ff</span></span></span> va créer un nouveau commit lors de la fusion, même si la fusion aurait pu se faire avec un fast-forward. Cela évite de perdre l’information de l’existence historique d’une branche de fonctionnalité et groupe ensemble tous les commits qui ont été ajoutés à la fonctionnalité.</p>
  124. <p>Regardez la différence :</p>
  125. <p><img src="http://nvie.com/img/merge-without-ff@2x.png" alt="Fusion avec et sans l’option fast-foward"/></p>
  126. <p>Dans le deuxième cas, il est impossible de voir à partir de l’historique de Git quel groupe de commits a implémenté une fonctionnalité – il faudrait lire manuellement tous les messages de logs. Supprimer une fonctionnalité (c’est à dire un ensemble de commits) est un vrai casse-tête dans la deuxième situation, alors que c’est très facile à faire lorque l’option &#13;
  127. <span id="crayon-5524f183299d4580809159" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-o">--</span><span class="crayon-i">no</span><span class="crayon-o">-</span><span class="crayon-i">ff</span></span></span> a été utilisée.</p>
  128. <p>Oui, cela va créer quelques commits (vides) supplémentaires, mais le gain est tellement supérieur au coût.</p>
  129. <p>Malheureusement, je n’ai pas encore trouvé de manière de faire de &#13;
  130. <span id="crayon-5524f183299d7714061467" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-o">--</span><span class="crayon-i">no</span><span class="crayon-o">-</span><span class="crayon-i">ff</span></span></span> l’option par défaut de git merge, mais ça devrait vraiment l’être.</p>
  131. <h2>Les branches de version</h2>
  132. <dl>
  133. <dt>Peuvent provenir de :</dt>
  134. <dd>&#13;
  135. <span id="crayon-5524f183299da002474249" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span></dd>
  136. <dt>Doivent être fusionnées dans :</dt>
  137. <dd>&#13;
  138. <span id="crayon-5524f183299dd657154296" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span> et &#13;
  139. <span id="crayon-5524f183299e0817444121" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">master</span></span></span></dd>
  140. <dt>Convention de nommage de la branche :</dt>
  141. <dd>&#13;
  142. <span id="crayon-5524f183299e3211039715" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">release</span><span class="crayon-o">-</span><span class="crayon-o">*</span></span></span></dd>
  143. </dl>
  144. <p>Les branches de version servent à préparer les nouvelles versions de production. Elles permettent les optimisations de dernière minute. De plus elles permettent la correction d’anomalies mineures et la préparation des méta-données pour une version (numéro, date de compilation, etc.). En faisant tout ce travail sur une branche de version, la branche &#13;
  145. <span id="crayon-5524f183299e7416678574" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span> peut incorporer des fonctionnalités pour la prochaine version majeure.</p>
  146. <p>Le bon moment pour créer une nouvelle branche de version depuis &#13;
  147. <span id="crayon-5524f183299ea065516621" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span> est quand &#13;
  148. <span id="crayon-5524f183299ed306026670" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span> reflète l’état désiré de la nouvelle version. A minima toutes les fonctionnalités visées pour la version à venir doivent être fusionnées dans &#13;
  149. <span id="crayon-5524f183299f0030554742" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span> à ce moment-là. Toutes les fonctionnalités visées pour les prochaines versions ne le sont pas – elles doivent attendre jusqu’à ce que la branche de version bifurque.</p>
  150. <p>C’est précisément au début d’une branche de version que la prochaine version se voit assigné un numéro de version – et pas avant. Avant ce moment, la branche &#13;
  151. <span id="crayon-5524f183299f3156614501" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span> reflète les changements pour la « prochaine version » mais sans forcément savoir si cette « prochaine version » sera la 0.3 ou la 1.0, du moins pas avant que la branche de version soit créé. Cette décision est prise au début de la nouvelle branche de version et dépend des règles mise en place sur les changements de numéros de version.</p>
  152. <h3>Créer une branche de version</h3>
  153. <p>Les branches de version sont créées à partir de la branche &#13;
  154. <span id="crayon-5524f183299f6836842602" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span>. Par exemple, disons que la version 1.1.5 est la version courante de production et que nous avons une nouvelle version majeure qui arrive. L’état de &#13;
  155. <span id="crayon-5524f183299f9481142192" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span> est prêt pour la « prochaine version » et nous avons décidé que cela deviendra la version 1.2 (plutôt que 1.1.6 ou 2.0). Donc nous bifurquons et donnons à la branche de version un nom qui reflète le nouveau numéro de version :</p>
  156. &#13;
  157. &#13;
  158. <div id="crayon-5524f183299fc564838810" class="crayon-syntax crayon-theme-github crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">&#13;
  159. &#13;
  160. &#13;
  161. <p class="crayon-info"/>&#13;
  162. <p class="crayon-plain-wrap"/>&#13;
  163. <div class="crayon-main">&#13;
  164. <table class="crayon-table">&#13;
  165. <tr class="crayon-row">&#13;
  166. <td class="crayon-nums " data-settings="show">&#13;
  167. &#13;
  168. </td>&#13;
  169. <td class="crayon-code"><div class="crayon-pre"><p class="crayon-line" id="crayon-5524f183299fc564838810-1"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-i">checkout</span><span class="crayon-h"> </span><span class="crayon-o">-</span><span class="crayon-i">b</span><span class="crayon-h"> </span><span class="crayon-i">release</span><span class="crayon-o">-</span><span class="crayon-cn">1.2</span><span class="crayon-h"> </span><span class="crayon-e">develop</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f183299fc564838810-2"><span class="crayon-e">Switched </span><span class="crayon-st">to</span><span class="crayon-h"> </span><span class="crayon-i">a</span><span class="crayon-h"> </span><span class="crayon-r">new</span><span class="crayon-h"> </span><span class="crayon-i">branch</span><span class="crayon-h"> </span><span class="crayon-s">"release-1.2"</span></p><p class="crayon-line" id="crayon-5524f183299fc564838810-3"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-sy">.</span><span class="crayon-o">/</span><span class="crayon-i">bump</span><span class="crayon-o">-</span><span class="crayon-i">version</span><span class="crayon-sy">.</span><span class="crayon-i">sh</span><span class="crayon-h"> </span><span class="crayon-cn">1.2</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f183299fc564838810-4"><span class="crayon-e">Files </span><span class="crayon-e">modified </span><span class="crayon-i">successfully</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-e">version </span><span class="crayon-e">bumped </span><span class="crayon-st">to</span><span class="crayon-h"> </span><span class="crayon-cn">1.2.</span></p><p class="crayon-line" id="crayon-5524f183299fc564838810-5"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-i">commit</span><span class="crayon-h"> </span><span class="crayon-o">-</span><span class="crayon-i">a</span><span class="crayon-h"> </span><span class="crayon-o">-</span><span class="crayon-i">m</span><span class="crayon-h"> </span><span class="crayon-s">"Bumped version number to 1.2"</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f183299fc564838810-6"><span class="crayon-sy">[</span><span class="crayon-i">release</span><span class="crayon-o">-</span><span class="crayon-cn">1.2</span><span class="crayon-h"> </span><span class="crayon-cn">74d9424</span><span class="crayon-sy">]</span><span class="crayon-h"> </span><span class="crayon-e">Bumped </span><span class="crayon-e">version </span><span class="crayon-e">number </span><span class="crayon-st">to</span><span class="crayon-h"> </span><span class="crayon-cn">1.2</span></p><p class="crayon-line" id="crayon-5524f183299fc564838810-7"><span class="crayon-cn">1</span><span class="crayon-h"> </span><span class="crayon-e">files </span><span class="crayon-i">changed</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-cn">1</span><span class="crayon-h"> </span><span class="crayon-e">insertions</span><span class="crayon-sy">(</span><span class="crayon-o">+</span><span class="crayon-sy">)</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-cn">1</span><span class="crayon-h"> </span><span class="crayon-e">deletions</span><span class="crayon-sy">(</span><span class="crayon-o">-</span><span class="crayon-sy">)</span></p></div></td>&#13;
  170. </tr>&#13;
  171. </table>&#13;
  172. </div>&#13;
  173. </div>&#13;
  174. &#13;
  175. <p>Après avoir crée une nouvelle branche, et nous être positionné dessus, nous incrémentons le numéro de version. Ici, &#13;
  176. <span id="crayon-5524f183299ff973330345" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">bump</span><span class="crayon-o">-</span><span class="crayon-i">version</span><span class="crayon-sy">.</span><span class="crayon-i">sh</span></span></span> est un script shell fictif qui change quelques fichiers dans notre dossier de travail pour refléter la nouvelle version. (Cela peut bien évidemment être un changement manuel – le propos étant que <em>certains</em> fichiers changent.) Puis, le changement de numéro de version est enregistré.</p>
  177. <p>Cette nouvelle branche pourra exister pendant un moment, jusqu’à ce que la version soit déployée pour de bon. Pendant ce temps, des correctifs pourront être appliqués à cette branche (plutôt que sur la branche &#13;
  178. <span id="crayon-5524f18329a03209989767" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span>), et par conséquent en attendant la prochaine version majeure.</p>
  179. <h3>Finaliser une branche de version</h3>
  180. <p>Quand l’état de la branche de version est prêt à devenir une vraie version, quelques actions doivent êtres effectuées. Premièrement, la branche de release est fusionnée dans &#13;
  181. <span id="crayon-5524f18329a06492449599" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">master</span></span></span> (puisque chaque commit sur &#13;
  182. <span id="crayon-5524f18329a09723314436" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">master</span></span></span> est une nouvelle version <em>par définition</em>, souvenez-vous). Ensuite, ce commit sur &#13;
  183. <span id="crayon-5524f18329a0c616510063" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">master</span></span></span> doit être tagué pour pouvoir faire simplement référence par la suite à cette version historique. Enfin, les changements fais sur la branche de version doivent être reversés dans &#13;
  184. <span id="crayon-5524f18329a0f296433887" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span>, afin que les version futures contiennent aussi ces correctifs.</p>
  185. <p>Les deux premieres étapes dans Git :</p>
  186. &#13;
  187. &#13;
  188. <div id="crayon-5524f18329a12992468861" class="crayon-syntax crayon-theme-github crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">&#13;
  189. &#13;
  190. &#13;
  191. <p class="crayon-info"/>&#13;
  192. <p class="crayon-plain-wrap"/>&#13;
  193. <div class="crayon-main">&#13;
  194. <table class="crayon-table">&#13;
  195. <tr class="crayon-row">&#13;
  196. <td class="crayon-nums " data-settings="show">&#13;
  197. &#13;
  198. </td>&#13;
  199. <td class="crayon-code"><div class="crayon-pre"><p class="crayon-line" id="crayon-5524f18329a12992468861-1"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-e">checkout </span><span class="crayon-e">master</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f18329a12992468861-2"><span class="crayon-e">Switched </span><span class="crayon-st">to</span><span class="crayon-h"> </span><span class="crayon-i">branch</span><span class="crayon-h"> </span><span class="crayon-s">'master'</span></p><p class="crayon-line" id="crayon-5524f18329a12992468861-3"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-i">merge</span><span class="crayon-h"> </span><span class="crayon-o">--</span><span class="crayon-i">no</span><span class="crayon-o">-</span><span class="crayon-e">ff </span><span class="crayon-i">release</span><span class="crayon-o">-</span><span class="crayon-cn">1.2</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f18329a12992468861-4"><span class="crayon-e">Merge </span><span class="crayon-e">made </span><span class="crayon-e">by </span><span class="crayon-i">recursive</span><span class="crayon-sy">.</span></p><p class="crayon-line" id="crayon-5524f18329a12992468861-5"><span class="crayon-sy">(</span><span class="crayon-cn">R</span>é<span class="crayon-i">sum</span>é<span class="crayon-h"> </span><span class="crayon-e">des </span><span class="crayon-i">changements</span><span class="crayon-sy">)</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f18329a12992468861-6"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-i">tag</span><span class="crayon-h"> </span><span class="crayon-o">-</span><span class="crayon-i">a</span><span class="crayon-h"> </span><span class="crayon-cn">1.2</span></p></div></td>&#13;
  200. </tr>&#13;
  201. </table>&#13;
  202. </div>&#13;
  203. </div>&#13;
  204. &#13;
  205. <p>La version est maintenant terminée et taguée pour toute référence future.</p>
  206. <p>Remarque : Vous pouvez tout aussi bien vouloir utiliser les options &#13;
  207. <span id="crayon-5524f18329a15062153907" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-o">-</span><span class="crayon-i">s</span></span></span> or &#13;
  208. <span id="crayon-5524f18329a18779032012" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-o">-</span><span class="crayon-i">u</span></span></span> &#13;
  209. <span id="crayon-5524f18329a1b034256407" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-o">&lt;</span><span class="crayon-i">clef</span><span class="crayon-o">&gt;</span></span></span> pour signer votre tag de manière chiffrée.</p>
  210. <p>Pour garder les changements effectués dans la branche de version, nous avons besoin de les fusionner dans &#13;
  211. <span id="crayon-5524f18329a1e753025917" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span>. Avec Git :</p>
  212. &#13;
  213. &#13;
  214. <div id="crayon-5524f18329a21059551202" class="crayon-syntax crayon-theme-github crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">&#13;
  215. &#13;
  216. &#13;
  217. <p class="crayon-info"/>&#13;
  218. <p class="crayon-plain-wrap"/>&#13;
  219. <div class="crayon-main">&#13;
  220. <table class="crayon-table">&#13;
  221. <tr class="crayon-row">&#13;
  222. <td class="crayon-nums " data-settings="show">&#13;
  223. &#13;
  224. </td>&#13;
  225. <td class="crayon-code"><div class="crayon-pre"><p class="crayon-line" id="crayon-5524f18329a21059551202-1"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-e">checkout </span><span class="crayon-e">develop</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f18329a21059551202-2"><span class="crayon-e">Switched </span><span class="crayon-st">to</span><span class="crayon-h"> </span><span class="crayon-i">branch</span><span class="crayon-h"> </span><span class="crayon-s">'develop'</span></p><p class="crayon-line" id="crayon-5524f18329a21059551202-3"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-i">merge</span><span class="crayon-h"> </span><span class="crayon-o">--</span><span class="crayon-i">no</span><span class="crayon-o">-</span><span class="crayon-e">ff </span><span class="crayon-i">release</span><span class="crayon-o">-</span><span class="crayon-cn">1.2</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f18329a21059551202-4"><span class="crayon-e">Merge </span><span class="crayon-e">made </span><span class="crayon-e">by </span><span class="crayon-i">recursive</span><span class="crayon-sy">.</span></p><p class="crayon-line" id="crayon-5524f18329a21059551202-5"><span class="crayon-sy">(</span><span class="crayon-cn">R</span>é<span class="crayon-i">sum</span>é<span class="crayon-h"> </span><span class="crayon-e">des </span><span class="crayon-i">changements</span><span class="crayon-sy">)</span></p></div></td>&#13;
  226. </tr>&#13;
  227. </table>&#13;
  228. </div>&#13;
  229. </div>&#13;
  230. &#13;
  231. <p>Cette étape peut mener à une conflit de fusion (probablement même, puisque nous avons changé le numéro de version. Si c’est le cas, corrigez-le et faîtes un commit.</p>
  232. <p>Maintenant nous avons vraiment terminé et la branche de version peut être supprimée, puisque nous n’en avons plus besoin :</p>
  233. &#13;
  234. &#13;
  235. <div id="crayon-5524f18329a24711392903" class="crayon-syntax crayon-theme-github crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">&#13;
  236. &#13;
  237. &#13;
  238. <p class="crayon-info"/>&#13;
  239. <p class="crayon-plain-wrap"/>&#13;
  240. <div class="crayon-main">&#13;
  241. <table class="crayon-table">&#13;
  242. <tr class="crayon-row">&#13;
  243. <td class="crayon-nums " data-settings="show">&#13;
  244. &#13;
  245. </td>&#13;
  246. <td class="crayon-code"><div class="crayon-pre"><p class="crayon-line" id="crayon-5524f18329a24711392903-1"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-i">branch</span><span class="crayon-h"> </span><span class="crayon-o">-</span><span class="crayon-i">d</span><span class="crayon-h"> </span><span class="crayon-i">release</span><span class="crayon-o">-</span><span class="crayon-cn">1.2</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f18329a24711392903-2"><span class="crayon-e">Deleted </span><span class="crayon-e">branch </span><span class="crayon-i">release</span><span class="crayon-o">-</span><span class="crayon-cn">1.2</span><span class="crayon-h"> </span><span class="crayon-sy">(</span><span class="crayon-e">was </span><span class="crayon-i">ff452fe</span><span class="crayon-sy">)</span><span class="crayon-sy">.</span></p></div></td>&#13;
  247. </tr>&#13;
  248. </table>&#13;
  249. </div>&#13;
  250. </div>&#13;
  251. &#13;
  252. <h3>Les branches de correctifs</h3>
  253. <dl>
  254. <dt>Peuvent provenir de :</dt>
  255. <dd>&#13;
  256. <span id="crayon-5524f18329a27779043643" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">master</span></span></span></dd>
  257. <dt>Doivent être fusionnées dans :</dt>
  258. <dd>&#13;
  259. <span id="crayon-5524f18329a2a439073976" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span> et &#13;
  260. <span id="crayon-5524f18329a2d861174094" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">master</span></span></span></dd>
  261. <dt>Convention de nommage de la branche :</dt>
  262. <dd>&#13;
  263. <span id="crayon-5524f18329a30801517913" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">hotfix</span><span class="crayon-o">-</span><span class="crayon-o">*</span></span></span></dd>
  264. </dl>
  265. <p><img src="http://nvie.com/img/hotfix-branches@2x.png" alt="Une branche de correctif"/></p>
  266. <p>Les branches de correctifs ressemblent beaucoup aux branches de version, dans le sens où elles sont également destinées à préparer une nouvelle version de production, bien que non planifiées. Elles viennent de la nécessité d’agir immédiatement sur un état indésirable d’une version en production. Quand une anomalie critique doit être résolu immédiatement, une branche de correctif peut être crée à partir du tag correspondant sur la branche master qui marque la version de production.</p>
  267. <p>L’objectif est que le travail des membres de l’équipe (sur la branche &#13;
  268. <span id="crayon-5524f18329a33419898162" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span>) puisse continuer, pendant qu’une autre personne prépare un correctif rapide pour la production.</p>
  269. <h3>Créer une branche de correctif</h3>
  270. <p>Les branches de correctif sont créées à partir de la branche &#13;
  271. <span id="crayon-5524f18329a36595034680" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">master</span></span></span>. Par exemple, disons que la version 1.2 est la version qui tourne actuellement en production et que plusieurs anomalies posent problème. Dans le même temps les modifications effectuées sur &#13;
  272. <span id="crayon-5524f18329a3a600800921" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span> sont encore instables. Nous pouvons alors créer une branche de correctif et commencer à corriger le problème :</p>
  273. &#13;
  274. &#13;
  275. <div id="crayon-5524f18329a3d378202537" class="crayon-syntax crayon-theme-github crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">&#13;
  276. &#13;
  277. &#13;
  278. <p class="crayon-info"/>&#13;
  279. <p class="crayon-plain-wrap"/>&#13;
  280. <div class="crayon-main">&#13;
  281. <table class="crayon-table">&#13;
  282. <tr class="crayon-row">&#13;
  283. <td class="crayon-nums " data-settings="show">&#13;
  284. &#13;
  285. </td>&#13;
  286. <td class="crayon-code"><div class="crayon-pre"><p class="crayon-line" id="crayon-5524f18329a3d378202537-1"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-i">checkout</span><span class="crayon-h"> </span><span class="crayon-o">-</span><span class="crayon-i">b</span><span class="crayon-h"> </span><span class="crayon-i">hotfix</span><span class="crayon-o">-</span><span class="crayon-cn">1.2.1</span><span class="crayon-h"> </span><span class="crayon-e">master</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f18329a3d378202537-2"><span class="crayon-e">Switched </span><span class="crayon-st">to</span><span class="crayon-h"> </span><span class="crayon-i">a</span><span class="crayon-h"> </span><span class="crayon-r">new</span><span class="crayon-h"> </span><span class="crayon-i">branch</span><span class="crayon-h"> </span><span class="crayon-s">"hotfix-1.2.1"</span></p><p class="crayon-line" id="crayon-5524f18329a3d378202537-3"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-sy">.</span><span class="crayon-o">/</span><span class="crayon-i">bump</span><span class="crayon-o">-</span><span class="crayon-i">version</span><span class="crayon-sy">.</span><span class="crayon-i">sh</span><span class="crayon-h"> </span><span class="crayon-cn">1.2.1</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f18329a3d378202537-4"><span class="crayon-e">Files </span><span class="crayon-e">modified </span><span class="crayon-i">successfully</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-e">version </span><span class="crayon-e">bumped </span><span class="crayon-st">to</span><span class="crayon-h"> </span><span class="crayon-cn">1.2.1.</span></p><p class="crayon-line" id="crayon-5524f18329a3d378202537-5"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-i">commit</span><span class="crayon-h"> </span><span class="crayon-o">-</span><span class="crayon-i">a</span><span class="crayon-h"> </span><span class="crayon-o">-</span><span class="crayon-i">m</span><span class="crayon-h"> </span><span class="crayon-s">"Bumped version number to 1.2.1"</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f18329a3d378202537-6"><span class="crayon-sy">[</span><span class="crayon-i">hotfix</span><span class="crayon-o">-</span><span class="crayon-cn">1.2.1</span><span class="crayon-h"> </span><span class="crayon-cn">41e61bb</span><span class="crayon-sy">]</span><span class="crayon-h"> </span><span class="crayon-e">Bumped </span><span class="crayon-e">version </span><span class="crayon-e">number </span><span class="crayon-st">to</span><span class="crayon-h"> </span><span class="crayon-cn">1.2.1</span></p><p class="crayon-line" id="crayon-5524f18329a3d378202537-7"><span class="crayon-cn">1</span><span class="crayon-h"> </span><span class="crayon-e">files </span><span class="crayon-i">changed</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-cn">1</span><span class="crayon-h"> </span><span class="crayon-e">insertions</span><span class="crayon-sy">(</span><span class="crayon-o">+</span><span class="crayon-sy">)</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-cn">1</span><span class="crayon-h"> </span><span class="crayon-e">deletions</span><span class="crayon-sy">(</span><span class="crayon-o">-</span><span class="crayon-sy">)</span></p></div></td>&#13;
  287. </tr>&#13;
  288. </table>&#13;
  289. </div>&#13;
  290. </div>&#13;
  291. &#13;
  292. <p>N’oubliez pas de modifier le numéro de version après la création de la branche !</p>
  293. <p>Ensuite, corrigez le bug et enregistrez le correctif dans un ou plusieurs commits séparés.</p>
  294. &#13;
  295. &#13;
  296. <div id="crayon-5524f18329a40868633621" class="crayon-syntax crayon-theme-github crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">&#13;
  297. &#13;
  298. &#13;
  299. <p class="crayon-info"/>&#13;
  300. <p class="crayon-plain-wrap"/>&#13;
  301. <div class="crayon-main">&#13;
  302. <table class="crayon-table">&#13;
  303. <tr class="crayon-row">&#13;
  304. <td class="crayon-nums " data-settings="show">&#13;
  305. &#13;
  306. </td>&#13;
  307. <td class="crayon-code"><div class="crayon-pre"><p class="crayon-line" id="crayon-5524f18329a40868633621-1"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-i">commit</span><span class="crayon-h"> </span><span class="crayon-o">-</span><span class="crayon-i">m</span><span class="crayon-h"> </span><span class="crayon-s">"Fixed severe production problem"</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f18329a40868633621-2"><span class="crayon-sy">[</span><span class="crayon-i">hotfix</span><span class="crayon-o">-</span><span class="crayon-cn">1.2.1</span><span class="crayon-h"> </span><span class="crayon-i">abbe5d6</span><span class="crayon-sy">]</span><span class="crayon-h"> </span><span class="crayon-e">Fixed </span><span class="crayon-e">severe </span><span class="crayon-e">production </span><span class="crayon-i">problem</span></p><p class="crayon-line" id="crayon-5524f18329a40868633621-3"><span class="crayon-cn">5</span><span class="crayon-h"> </span><span class="crayon-e">files </span><span class="crayon-i">changed</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-cn">32</span><span class="crayon-h"> </span><span class="crayon-e">insertions</span><span class="crayon-sy">(</span><span class="crayon-o">+</span><span class="crayon-sy">)</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-cn">17</span><span class="crayon-h"> </span><span class="crayon-e">deletions</span><span class="crayon-sy">(</span><span class="crayon-o">-</span><span class="crayon-sy">)</span></p></div></td>&#13;
  308. </tr>&#13;
  309. </table>&#13;
  310. </div>&#13;
  311. </div>&#13;
  312. &#13;
  313. <h3>Finalisation d’une branche de correctif</h3>
  314. <p>Lorsque c’est terminé, le correctif a besoin d’être reporté dans &#13;
  315. <span id="crayon-5524f18329a43970059185" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">master</span></span></span>, mais aussi dans &#13;
  316. <span id="crayon-5524f18329a46627426476" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span>, de manière à garantir que le correctif sera également inclus dans la prochaine version. C’est en tout point similaire à la manière dont les branches de version sont finalisées.</p>
  317. <p>Premièrement, mettez à jour &#13;
  318. <span id="crayon-5524f18329a49199068534" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">master</span></span></span> et taguez la version :</p>
  319. &#13;
  320. &#13;
  321. <div id="crayon-5524f18329a4c435859100" class="crayon-syntax crayon-theme-github crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">&#13;
  322. &#13;
  323. &#13;
  324. <p class="crayon-info"/>&#13;
  325. <p class="crayon-plain-wrap"/>&#13;
  326. <div class="crayon-main">&#13;
  327. <table class="crayon-table">&#13;
  328. <tr class="crayon-row">&#13;
  329. <td class="crayon-nums " data-settings="show">&#13;
  330. &#13;
  331. </td>&#13;
  332. <td class="crayon-code"><div class="crayon-pre"><p class="crayon-line" id="crayon-5524f18329a4c435859100-1"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-e">checkout </span><span class="crayon-e">master</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f18329a4c435859100-2"><span class="crayon-e">Switched </span><span class="crayon-st">to</span><span class="crayon-h"> </span><span class="crayon-i">branch</span><span class="crayon-h"> </span><span class="crayon-s">'master'</span></p><p class="crayon-line" id="crayon-5524f18329a4c435859100-3"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-i">merge</span><span class="crayon-h"> </span><span class="crayon-o">--</span><span class="crayon-i">no</span><span class="crayon-o">-</span><span class="crayon-e">ff </span><span class="crayon-i">hotfix</span><span class="crayon-o">-</span><span class="crayon-cn">1.2.1</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f18329a4c435859100-4"><span class="crayon-e">Merge </span><span class="crayon-e">made </span><span class="crayon-e">by </span><span class="crayon-i">recursive</span><span class="crayon-sy">.</span></p><p class="crayon-line" id="crayon-5524f18329a4c435859100-5"><span class="crayon-sy">(</span><span class="crayon-cn">R</span>é<span class="crayon-i">sum</span>é<span class="crayon-h"> </span><span class="crayon-e">des </span><span class="crayon-i">modifications</span><span class="crayon-sy">)</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f18329a4c435859100-6"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-i">tag</span><span class="crayon-h"> </span><span class="crayon-o">-</span><span class="crayon-i">a</span><span class="crayon-h"> </span><span class="crayon-cn">1.2.1</span></p></div></td>&#13;
  333. </tr>&#13;
  334. </table>&#13;
  335. </div>&#13;
  336. </div>&#13;
  337. &#13;
  338. <p>Remarque : Vous pouvez tout aussi bien vouloir utiliser les options &#13;
  339. <span id="crayon-5524f18329a4f136312351" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-o">-</span><span class="crayon-i">s</span></span></span> or &#13;
  340. <span id="crayon-5524f18329a52489059065" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-o">-</span><span class="crayon-i">u</span></span></span> &#13;
  341. <span id="crayon-5524f18329a55688246346" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-o">&lt;</span><span class="crayon-i">clef</span><span class="crayon-o">&gt;</span></span></span> pour signer votre tag de manière chiffrée.</p>
  342. <p>Ensuite, déployez également le correctif dans &#13;
  343. <span id="crayon-5524f18329a58834630723" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span> :</p>
  344. &#13;
  345. &#13;
  346. <div id="crayon-5524f18329a5b304708732" class="crayon-syntax crayon-theme-github crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">&#13;
  347. &#13;
  348. &#13;
  349. <p class="crayon-info"/>&#13;
  350. <p class="crayon-plain-wrap"/>&#13;
  351. <div class="crayon-main">&#13;
  352. <table class="crayon-table">&#13;
  353. <tr class="crayon-row">&#13;
  354. <td class="crayon-nums " data-settings="show">&#13;
  355. &#13;
  356. </td>&#13;
  357. <td class="crayon-code"><div class="crayon-pre"><p class="crayon-line" id="crayon-5524f18329a5b304708732-1"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-e">checkout </span><span class="crayon-e">develop</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f18329a5b304708732-2"><span class="crayon-e">Switched </span><span class="crayon-st">to</span><span class="crayon-h"> </span><span class="crayon-i">branch</span><span class="crayon-h"> </span><span class="crayon-s">'develop'</span></p><p class="crayon-line" id="crayon-5524f18329a5b304708732-3"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-i">merge</span><span class="crayon-h"> </span><span class="crayon-o">--</span><span class="crayon-i">no</span><span class="crayon-o">-</span><span class="crayon-e">ff </span><span class="crayon-i">hotfix</span><span class="crayon-o">-</span><span class="crayon-cn">1.2.1</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f18329a5b304708732-4"><span class="crayon-e">Merge </span><span class="crayon-e">made </span><span class="crayon-e">by </span><span class="crayon-i">recursive</span><span class="crayon-sy">.</span></p><p class="crayon-line" id="crayon-5524f18329a5b304708732-5"><span class="crayon-sy">(</span><span class="crayon-cn">R</span>é<span class="crayon-i">sum</span>é<span class="crayon-h"> </span><span class="crayon-e">des </span><span class="crayon-i">modifications</span><span class="crayon-sy">)</span></p></div></td>&#13;
  358. </tr>&#13;
  359. </table>&#13;
  360. </div>&#13;
  361. </div>&#13;
  362. &#13;
  363. <p>La seule exception à la règle ici est que, <strong>lorsqu’une branche de version en cours de developpement existe, le correctif a besoin d’être reporté dans cette branche de version, plutôt que dans &#13;
  364. <span id="crayon-5524f18329a5e753088104" class="crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-i">develop</span></span></span></strong>. Le report de l’anomalie dans la branche de version finira par être reporté dans develop à son tour, lorsque la branche de version sera terminée. (Si le travail en cours sur develop nécessite que l’anomalie soit corrigée immédiatement sans attendre la fin de la branche de version, vous pouvez tout aussi bien reporter dès à présent le correctif également sur develop.)</p>
  365. <p>Enfin, supprimer la branche temporaire :</p>
  366. &#13;
  367. &#13;
  368. <div id="crayon-5524f18329a61407983306" class="crayon-syntax crayon-theme-github crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">&#13;
  369. &#13;
  370. &#13;
  371. <p class="crayon-info"/>&#13;
  372. <p class="crayon-plain-wrap"/>&#13;
  373. <div class="crayon-main">&#13;
  374. <table class="crayon-table">&#13;
  375. <tr class="crayon-row">&#13;
  376. <td class="crayon-nums " data-settings="show">&#13;
  377. &#13;
  378. </td>&#13;
  379. <td class="crayon-code"><div class="crayon-pre"><p class="crayon-line" id="crayon-5524f18329a61407983306-1"><span class="crayon-sy">$</span><span class="crayon-h"> </span><span class="crayon-e">git </span><span class="crayon-i">branch</span><span class="crayon-h"> </span><span class="crayon-o">-</span><span class="crayon-i">d</span><span class="crayon-h"> </span><span class="crayon-i">hotfix</span><span class="crayon-o">-</span><span class="crayon-cn">1.2.1</span></p><p class="crayon-line crayon-striped-line" id="crayon-5524f18329a61407983306-2"><span class="crayon-e">Deleted </span><span class="crayon-e">branch </span><span class="crayon-i">hotfix</span><span class="crayon-o">-</span><span class="crayon-cn">1.2.1</span><span class="crayon-h"> </span><span class="crayon-sy">(</span><span class="crayon-e">was </span><span class="crayon-i">abbe5d6</span><span class="crayon-sy">)</span><span class="crayon-sy">.</span></p></div></td>&#13;
  380. </tr>&#13;
  381. </table>&#13;
  382. </div>&#13;
  383. </div>&#13;
  384. &#13;
  385. <h2>En résumé</h2>
  386. <p>Bien qu’il n’y ait rien de bien révolutionnaire dans ce modèle de développement, l’illustration qui figure au début de cet article s’est révélée particulièrement utile dans nos projets. C’est un modèle mental facile à appréhender et il permet de développer une appropriation collective des processus de branches et de versions.</p>
  387. <p>Enfin, voici <a href="http://nvie.com/files/Git-branching-model.pdf">une version PDF en haute résolution du modèle</a>. Imprimez-le et accrochez le au mur pour avoir une référence sous les yeux à tout moment.</p>
  388. <p><em>NdT : Pour aller plus loin, nous vous recommandons de lire <a href="http://jeffkreeftmeijer.com/2010/why-arent-you-using-git-flow/" title="Why aren't you using Gitflow?">cette introduction à Gitflow</a>, dont le but est de vous aider à suivre ce modèle de développement. Il existe d’autres workflows Git que vous pouvez tester comme le <a href="https://guides.github.com/introduction/flow/index.html" title="Comprendre le Github Flow (anglais)">Github Flow</a>, le <a href="https://about.gitlab.com/2014/09/29/gitlab-flow/">Gitlab Flow</a>, celui <a href="http://fbrnc.net/blog/2014/12/keeping-it-simple-git-workflow" title="Keepiing it simple Git Workflow (en anglais)">utilisé chez AOE</a> ou cette <a href="https://www.atlassian.com/git/tutorials/comparing-workflows" title="Comparing Workflows (en anglais)">comparaison de workflow chez Atlasssian</a>, l’essentiel étant de l’adapter à votre contexte et à votre équipe.</em></p>