C'est un problème délicat mais auquel beaucoup de gens sont confrontés. Je préfère utiliser la configuration Gitflow comme point de départ.
Développement -> De nouvelles choses en cours de développement
Master -> Trucs finis nécessitant des tests Production -> Trucs qui ont été publiés en production.
Pour les fonctionnalités mineures (plus courtes), je crée une branche à partir du développement, je fais le travail, puis je fusionne la branche au développement.
Pour les fonctionnalités principales (à long terme), je crée une branche à partir du développement, je crée des branches plus petites à partir de cette branche, puis je fusionne de nouveau avec la première branche. Une fois que la fonctionnalité principale est terminée, elle revient dans la branche de développement.
À intervalles réguliers (selon le projet), je fusionne à nouveau le développement dans le maître et un cycle de test commence. Si des correctifs apparaissent lors des tests, ils sont effectués dans la branche principale (sous-branche puis fusionnez). Et le développement peut continuer sur la branche principale pendant les tests.
À tout moment, le maître doit être fusionné avec le développement, et le développement doit être fusionné avec l'une de ses sous-branches à long terme.
le maître doit toujours (en théorie) être prêt pour la production. Le développement doit toujours (en théorie) être prêt pour la production. La seule raison pour laquelle il existe une différence est de fournir un ensemble solide de fonctionnalités aux testeurs.
Une fois prêt, une validation dans le maître qui est testée est fusionnée dans la production et le déploiement en production se produit à partir de cette branche. Les HOTFIX qui doivent être effectués en cas d'urgence peuvent alors avoir lieu sur la branche Production sans avoir à fusionner dans le maître (qui peut avoir de nombreuses modifications non testées).
Mon arbre normal ressemble
LongTerm -> Development -> Master -> Production
LongTerm <- Development | |
| Development -> Master |
LongTerm <- Development -> Master |
Development <- Master |
Master -> Production
C'est ma règle générale qu'aucun changement ne devrait prendre plus de quelques heures. Si c'est le cas, il doit être transformé en changements plus petits. Si c'est une fonctionnalité énorme (comme une réécriture d'interface utilisateur), cela se poursuit à long terme afin que le développement normal puisse se poursuivre en même temps. Les succursales LongTerm ne sont normalement que des succursales locales tandis que Développement, Maître et Production sont des succursales distantes. Toutes les sous-branches sont également locales uniquement. Cela garde le référentiel propre pour les autres, sans perdre l'utilité de git sur un ensemble de fonctionnalités à long terme.
Je voudrais cependant noter que l'existence d'une succursale à long terme est une chose rare. Normalement, tout mon travail est en développement. Ce n'est que lorsque j'ai une fonctionnalité (ensemble) qui va prendre si longtemps que je dois aussi pouvoir travailler sur des trucs de développement normaux que j'utilise la branche LongTerm. Si ce n'est qu'un ensemble de changements qui devraient être ensemble, je ne fusionne tout simplement pas jusqu'à ce que tout soit fait.