web-dev-qa-db-fra.com

La tendance à la disparition de la branche "développer"

J'ai remarqué récemment quelque chose en regardant certains projets populaires sur GitHub, qu'il n'y a pas de branche develop. Et en fait, le GitHub Flow guide ne le mentionne pas non plus. D'après ma compréhension, master devrait toujours être totalement stable et refléter la production. Si les développeurs travaillent sur des branches de fonctionnalités, puis les fusionnent dans master lorsqu'ils ont terminé, cela signifie qu'il y a une période de temps où les fonctionnalités/correctifs sont fusionnés dans master et master branch est en fait plus récent que la production.

Ne serait-il pas plus logique que l'équipe crée des branches de fonctionnalité/correction à partir de develop, les fusionne à nouveau, puis lorsque la prochaine version est totalement prête à être publiée, develop est fusionnée dans master et une balise est créée? Imaginez si les gens fusionnent directement dans master, et qu'un bogue est signalé en production qui devient difficile à corriger car la base de code de la branche master a considérablement changé. Ensuite, les développeurs doivent simplement dire à l'utilisateur d'attendre la prochaine version pour voir le problème résolu.

EDIT: Cette question est différente de "à branche ou pas à branche." Il s'adresse spécifiquement aux personnes qui abandonnent l'utilisation de la branche de développement et aux raisons qui l'entourent, car cela a longtemps été présenté comme une meilleure pratique.

97
ffxsam

Cela vient de l'état d'esprit CI où il y a intégration plusieurs fois par jour.

Il y a des avantages et des inconvénients des deux.

Dans notre équipe, nous avons également abandonné la branche de développement, car nous pensions qu'elle n'apportait aucun avantage supplémentaire, mais quelques inconvénients. Nous avons configuré notre logiciel CI (Teamcity) pour compenser les inconvénients:

  1. Activez le déploiement d'un commit spécifique. En d'autres termes: nous ne déployons pas de branche. Nous déployons un commit.
  2. Nous pouvons déployer le maître ou les branches en commençant par un correctif/préfixe.

La raison pour laquelle cela fonctionne est que toutes les demandes de pull contiennent du code potentiellement libérable, mais cela ne signifie pas que nous déployons toutes les validations dans master.

La principale raison pour laquelle nous avons abandonné la branche develop est parce qu'elle avait tendance à devenir trop volumineuse et trop longue pour voir ce qu'elle contenait réellement. Si nous avons déployé quelque chose un peu prématurément, nous nous contentons de dériver une branche de correctif et de la déployer directement.

57

Une branche de développement est plus importante si votre processus de publication est complexe et que vous avez besoin de candidats sérieux à la publication.

Par exemple, imaginez que vous écrivez un logiciel qui est un micrologiciel sur les voitures. C'est ... non trivial à corriger et il est probable que toute version aurait un ensemble complet de tests non CI/d'intégration exécutés sur du matériel réel.

Dans ce cas, il peut être plus judicieux d'isoler un "candidat à la libération" dans une branche non maître (comme "développer"). Cela permet à votre équipe exécutant ces tests d'avoir une branche dans laquelle fusionner les fonctionnalités.

Les Webapps ou autres logiciels facilement mis à jour n'ont pas cette contrainte.

Cependant, notez que:

  • Beaucoup (la plupart?) De projets sur github n'ont pas ce genre de contrainte
  • Un "maître" principal sert le même but
  • Un workflow de "faire un PR vs maître" est beaucoup plus universel que "faire un PR contre une branche que vous ne connaissez pas immédiatement sur ce dépôt"
27
enderland

Il y a deux philosophies que j'ai vues dans les projets, et je pense que le choix est juste une question de goût:

  1. Désigner "maître" comme version de production et développer dans une branche "développer".

  2. Développez en "maître" et disposez d'une branche nommée différemment pour des versions de production stables. Cela a encore plus de sens si votre projet a plusieurs branches de version à la fois (par exemple, la version préférée actuelle est la version 1.8, mais vous maintenez également la version 1.7).

Les deux sont des approches communes et ont leurs avantages et leurs inconvénients.

21
Larry Gritz

Les versions en production peuvent être étiquetées, de sorte que la situation qui a été publiée peut toujours être reproduite sans consacrer une branche entière à cette fin.

Si un bogue critique est trouvé en production à un moment où master ne peut pas être publié, il est alors assez facile de retirer la balise et de démarrer une nouvelle branche "hotfixes-for-release-1.2.0" à partir de là. Mais cela devrait être plutôt rare.

La plupart du temps dans nos applications Web, master a changé depuis la dernière version mais pas de manière très significative, nous pouvons donc simplement faire une nouvelle version de master qui a le correctif. Cela aide de toute façon à faire des versions très fréquentes.

7
RemcoGerlich

Si les développeurs travaillent sur des branches de fonctionnalités, puis fusionnent celles-ci dans master lorsqu'elles ont terminé, cela signifie qu'il y a une période de temps où les fonctionnalités/correctifs sont fusionnés dans master et la branche master est en fait plus récent que la production.

...

Imaginez si les gens fusionnent directement dans master et qu'un bogue est signalé en production qui devient difficile à corriger car la base de code de la branche master a changé de manière significative.

Ce n'est pas Github Flow.

Il s'agit du processus de déploiement/fusion de Github Flow, selon votre lien:

Déployer

Une fois que votre demande d'extraction a été examinée et que la succursale a réussi vos tests, vous pouvez déployer vos modifications pour les vérifier en production. Si votre branche cause des problèmes, vous pouvez la restaurer en déployant le maître existant en production.

Fusionner

Maintenant que vos modifications ont été vérifiées en production, il est temps de fusionner votre code dans la branche principale.

(Souligner le mien)

En d'autres termes, master ne sera jamais en avance sur la production. De même, master sera toujours dans un état stable et libérable (à part les bogues non découverts), car tout est revu, testé et déployé en production avant fusionné en master.

5
8bittree

Le problème que je vois est que le déploiement/fusion de flux Git/Hub suppose qu'une fonctionnalité est développée/testée/fusionnée/déployée à la fois - et souvent selon mon expérience, ce n'est pas le cas. Si nous avons fusionné une fonctionnalité à la fois, il y a plus de risques de problèmes de régression - uniquement après la fusion des fonctionnalités à maîtriser et éventuellement en production.

Il doit y avoir un moyen de tester plusieurs fonctionnalités, de fusionner plusieurs fonctionnalités et de les déployer. J'ai utilisé une `` branche de bundle '' (une branche créée à partir de master avec des branches de fonctionnalités prêtes à être fusionnées) qui est déployée dans qa/uat. Les corrections pendant uat se produisent uniquement sur la branche de fonctionnalité, et celles-ci sont fusionnées à la branche bundle. Une fois qu'une sous-section de la branche de bundle a été approuvée, seules les fonctionnalités approuvées du bundle sont demandées par le pull à maîtriser - et le cycle est continu.

J'utilise cela avec Gitflow, mais je réfléchis à l'utiliser pour le flux GitHub. La fonctionnalité QA/UAT many à la fois semble importante. Un autre problème avec le flux GitHub est qu'il suppose tous les développeurs sr, et ce n'est pas toujours le cas.

Je préfère utiliser le flux GitHub en raison de sa simplicité. Avec une fonctionnalité de type bundle, je pense que ce serait mieux prêt. Il est possible que le bundle soit similaire à la version; cependant, j'y réfléchis toujours aussi.

Un autre problème est que le processus de demande d'extraction se produit à la fin avant la fusion avec le maître; cependant, vous voulez parfois coder la révision avant le test de qualité de l'entreprise - donc bien avant la fusion

1
David Latty