web-dev-qa-db-fra.com

Est-il préférable de fusionner "souvent" ou seulement après la fin de la fusion des branches de fonctionnalités?

Supposons que plusieurs branches sont en cours de développement, A et B, ainsi qu'une branche incrémentielle de "correction de bogue" C.

Maintenant, C est déjà "terminé" et fusionné dans master. A et B sont toujours en développement et ne seront pas corrigés avant (peut-être) qu'une autre branche de correction de bogue ne soit fusionnée dans master.

Est-ce une bonne idée de fusionner C dès que possible dans les nouvelles branches de fonctionnalités? Pour que les nouvelles fonctionnalités restent aussi proches de master que possible? Ou est-il préférable de laisser la nouvelle fonctionnalité être développée dans leur propre "monde" et de ne fusionner en master qu'une fois terminée?

Il y aura de toute façon des conflits, il faut donc consacrer du temps à les résoudre.

41
paul23

Plus une branche vit longtemps, plus elle est capable de diverger de la branche principale et plus la fusion résultante sera compliquée et compliquée lorsqu'elle sera finalement terminée. Dix petits conflits sont plus faciles à résoudre qu'un conflit massif et peuvent en fait empêcher les développeurs de dupliquer ou de gaspiller leurs efforts. Étant donné que, vous devez fusionner master en A et B régulièrement; une fois par jour est une recommandation assez courante, mais si vous avez beaucoup d'activité dans vos succursales, vous souhaiterez peut-être fusionner plusieurs fois par jour.

En plus de faciliter la résolution des conflits, vous mentionnez spécifiquement C est une branche de correction de bogues. En tant que développeur, je voudrais que ma branche dispose de toutes les dernières corrections de bogues, pour m'assurer que je ne répète pas un comportement qui a conduit à un bogue ou que j'écris des tests basés sur des données erronées.

Il y aura de toute façon des conflits, il faut donc consacrer du temps à les résoudre.

Si vous savez qu'il y aura des conflits, vous souhaiterez peut-être adopter une stratégie de branchement différente. Conservez plusieurs modifications apportées aux mêmes fichiers sur la même branche chaque fois que possible, et vous réduisez ou éliminez le nombre de conflits. Refactorisez les histoires afin qu'elles soient complètement indépendantes autant que possible, et retravaillez les branches pour couvrir éventuellement plusieurs histoires (branche, fonctionnalité et histoire ne sont pas toujours interchangeables).

74
mmathis

En supposant que votre intention est de fusionner à nouveau A, B en maître et de maintenir une base de code unique, ce n'est jamais une bonne idée de s'écarter trop du maître. Dévier trop longtemps de master, en particulier lorsque des corrections de bugs et d'autres développements fusionnent pour devenir master pendant que A, B sont en cours de développement, provoquera certainement des conflits.

Je considérerais des stratégies similaires à la suite

  1. Celui qui est responsable de A, B doit surveiller étroitement le maître et fusionner tout changement.
  2. Mieux encore, si vous avez construit et testé l'automatisation, assurez-vous que A, B fusionnent dans le maître et passez les tests tous les soirs.
  3. Sur la base de votre commentaire sur une autre réponse, il semble que A, B pourraient prendre un certain temps à se développer. Dans ce cas, vous pouvez même envisager de fusionner A, B afin de ne pas avoir de problème majeur à la fois pour les fusionner à nouveau dans le maître.
  4. À un niveau supérieur, réfléchissez à la raison pour laquelle vous avez besoin de 2 lignes distinctes de développement long. Pourriez-vous décomposer en petites fusions? Pourriez-vous vous diviser en microservices distincts?
12
kenchew

Habituellement souvent est meilleur que massif.

Les demandes de tirage plus petites, plus fréquentes sont presque toujours meilleures.

J'ai commencé à utiliser des drapeaux de configuration principalement afin de pouvoir faire des demandes d'extraction plus tôt afin de pouvoir, à mon tour, fusionner le code plus facilement, mais laisser la fonctionnalité désactivée. Plus la demande de tirage est petite, plus il est facile d'examiner le code, même s'il y a plus de demandes de tirage totales. La plupart des humains de toute sorte ne seront pas en mesure de faire des examens significatifs des demandes de tirage massives. C'est juste trop dur pour son mental RAM pour comprendre toutes les implications possibles d'un changement de code massif.

Il y a un surcoût supplémentaire dans la création d'un indicateur de configuration, donc cela ne vaut pas la peine pour les fonctionnalités plus petites. Mais votre demande de retrait sera de toute façon petite.

Il peut cependant y avoir des situations où la fonctionnalité doit être lancée en une seule fois. Même alors, il pourrait être préférable de faire des demandes de tirage plus petites vers une autre branche faite à cet effet.

La plupart de mes collègues gémissent quand quelqu'un crée une énorme requête, et pour la plupart, à juste titre.

Notez également que j'ai parfois besoin de sélectionner les commits dans des branches distinctes. Si ce qui doit être choisi par cerise peut être mis dans un seul commit, il est plus facile de le déplacer vers d'autres branches. C'est un cas où en fait avoir peu de commits est mieux, mais ce n'est pas exactement le processus standard si votre cerise cueille.

5
Mark Rogers

Dans Refactoring de Martin Fowler, le conseil qu'il donne est de ne jamais laisser une branche se dériver du maître pendant plus d'une journée. IIRC, vous devriez faire un petit changement, tester pour vous assurer que vous n'avez rien cassé, puis le fusionner à nouveau.

3
JohnnyApplesauce

Une autre option pour les changements de longue durée qui peuvent être terminés mais pas prêts à être utilisés est de les mettre derrière un indicateur de fonctionnalité afin qu'ils puissent être fusionnés pour être maîtrisés mais sans risque de casser quoi que ce soit. Ensuite, lorsqu'ils sont prêts à être utilisés, l'indicateur de fonctionnalité peut être supprimé.

2
Qwertie