Est-il préférable de fusionner «souvent» ou seulement après l'achèvement d'une grande fusion de branches de fonctions?

40

Dire plusieurs branches sont en cours d' élaboration, Aet B, ainsi qu'une branche « correction d' un bug » supplémentaire C.

Maintenant, Cc'est déjà "fini" et fusionné en maître. Aet Bsont toujours en développement et ne seront pas corrigés avant (peut-être) qu'une autre branche de correctif de bogue ne soit fusionnée dans le maître.

Est-ce une bonne idée de fusionner le Cplus rapidement possible dans les nouvelles branches de fonctionnalités? Pour que les nouvelles fonctionnalités restent aussi proches masterque possible? Ou est-il préférable de laisser la nouvelle fonctionnalité être développée dans leur propre "monde" fusionnant dans le master une fois qu'ils sont terminés?

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

paul23
la source
5
@gnat qui concerne la fusion de branches de fonctionnalités dans une ligne principale, je me demande si la fusion de la fonction principale pendant le développement de la fonctionnalité est une bonne solution pour "résoudre les conflits rapidement".
paul23
1
@ paul23, je dirais que c'est une nécessité pratique.
Berin Loritsch le
3
Honnêtement, une grande partie de mes problèmes de gestion de version ont disparu lorsque j'ai commencé à utiliser une conception correcte de mon code, comme isoler des modules et créer un modèle de travail bien défini. Si vous rencontrez trop de problèmes lors des fusions, il est possible qu'un autre problème plus grave se cache quelque part. Une bonne conception est incroyablement utile pour éviter des conflits inutiles.
T. Sar - Réintégrer Monica le
2
Vous voudrez peut-être fusionner régulièrement de la part du maître pour rester suffisamment "proches" pour ne pas rendre la fusion trop pénible par la suite.
Thorbjørn Ravn Andersen

Réponses:

71

Plus une branche vit longtemps, plus elle est en mesure de diverger de la branche principale et plus la fusion qui en résulte sera compliquée et compliquée à la fin de sa fusion. Dix conflits mineurs sont plus faciles à résoudre qu'un conflit massif et peuvent empêcher les développeurs de dupliquer ou de gaspiller leurs efforts. Étant donné que, vous devez fusionner masterdans Aet Brégulièrement; Une fois par jour est une recommandation plutôt commune, bien que si vous avez beaucoup d’activité sur vos branches, vous souhaiterez peut-être fusionner plusieurs fois par jour.

En plus de faciliter la résolution des conflits, vous mentionnez spécifiquement Cune branche de correction de bugs. En tant que développeur, je souhaiterais que ma branche dispose de toutes les dernières corrections de bogues, pour éviter de répéter le comportement qui a conduit à un bogue, ou d'écrire des tests basés sur des données erronées.

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

Si vous savez qu'il y aura des conflits, vous voudrez peut-être adopter une stratégie de branchement différente. Conservez plusieurs modifications dans le même fichier sur la même branche, dans la mesure du possible, et réduisez ou éliminez le nombre de conflits. Modifiez les histoires de manière à les rendre complètement indépendantes autant que possible, et modifiez les branches pour éventuellement couvrir plusieurs histoires (les branches, les fonctionnalités et les histoires ne sont pas toujours interchangeables).

mmathis
la source
33
Fusionner ou rebaser , car le rebasement produit souvent un historique de commit plus propre.
chrylis -on strike-
11
@chrylis: Reboucler peut être dangereux si "les branches couvrent des histoires multiples" signifie que deux développeurs travaillent sur la même branche.
Meriton - en grève le
9
@meriton à partir de la documentation officielle: ne réabaissez pas les commits qui existent en dehors de votre référentiel, car des personnes pourraient avoir travaillé sur ces travaux. Si vous suivez cette directive, tout ira bien. Si vous ne le faites pas, les gens vont vous haïr et vous serez méprisé par vos amis et votre famille. LOL
Xtreme Biker réintègre Monica le
6
@XtremeBiker: Une rebase dans Git change l'historique. Git fonctionne comme une réalité dans ce domaine: pour changer l’histoire, vous avez besoin d’un complot. Il existe une branche dans le référentiel de Git lui-même qui est régulièrement rebasée et elle est très publique. La raison pour laquelle cela fonctionne est qu’il existe un complot: tous les utilisateurs de cette branche s’engagent à réécrire l’histoire à certains moments, afin de s’assurer qu’ils sont en mesure de tout fusionner à l’époque.
Jörg W Mittag le
1
@ paul23 Envisagez sérieusement de transférer A et B dans une nouvelle branche partagée avant de les transmettre au maître. Si ce sont des révisions radicales, vous voulez les tester ensemble avant d’infliger la combinaison au maître. Si vous êtes sûr de pouvoir en livrer un directement à maîtriser, puis de transmettre l'autre à une nouvelle succursale mise à jour. Vous voudrez probablement pouvoir consulter le code d'origine de la deuxième fonctionnalité au cas où la fusion se déroulerait mal ou que vous deviez redéfinir quelque chose.
Sinc
11

En supposant que votre intention soit de fusionner finalement A, B en maître et de maintenir une base de code unique, ce n’est jamais une bonne idée de dévier trop du maître. S'écarter du maître trop longtemps, en particulier lorsque des correctifs de bogues et d'autres développements sont en train de fusionner avec le maître alors que A, B sont en cours de développement, provoquera certainement des conflits.

Je considérerais des stratégies similaires à celles qui suivent

  1. Quiconque est responsable de A, B doit surveiller le maître de près et s’intégrer à tous les changements.
  2. Mieux encore, si vous avez une automatisation de construction et de test, assurez-vous que A, B fusionnent en maître et réussissent les tests tous les soirs.
  3. Sur la base de votre commentaire à une autre réponse, il semble que A, B pourrait prendre un certain temps à se développer. Dans ce cas, vous pouvez même envisager que A, B se fusionnent également pour ne pas avoir de problèmes majeurs à fusionner les deux en 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 plus petites fusions? Pourriez-vous entrer dans des micro services séparés?
kenchew
la source
5

Habituellement, c'est souvent mieux qu'un gros.

Les demandes de retrait plus petites et plus fréquentes sont presque toujours meilleures.

J'ai commencé à utiliser des indicateurs de configuration principalement pour pouvoir effectuer plus tôt des requêtes d'extraction plus petites, ce qui me permet de fusionner le code plus facilement, tout en laissant la fonctionnalité désactivée. Plus la demande d'extraction est petite, plus il est facile d'examiner le code, même s'il y a plus de demandes d'extraction totales. La plupart des humains, de quelque type que ce soit, ne seront pas en mesure de procéder à des examens significatifs de demandes d’appel massif. Il est simplement trop difficile pour notre RAM mentale de comprendre toutes les implications possibles d'un changement de code massif.

La création d'un indicateur de configuration entraîne une charge supplémentaire, de sorte que cela ne vaut pas la peine pour les plus petites fonctionnalités. Mais alors, votre demande de tirage sera de toute façon petite.

Il peut toutefois y avoir des situations où la fonctionnalité doit être publiée en une fois. Même dans ce cas, il serait peut-être préférable de faire de plus petites demandes d'extraction à une autre branche à cette fin.

La plupart de mes collègues gémissent lorsque quelqu'un crée une demande d'attraction massive, et pour la plupart à juste titre.

Notez également que, parfois, j'ai besoin de sélectionner les commits dans une branche distincte. Si ce qui doit être sélectionné peut être mis dans un seul commit, il est plus facile de le déplacer dans d'autres branches. C’est un cas où il est préférable d’avoir peu d’engagements, mais ce n’est pas exactement le processus standard si vous choisissez le meilleur.

Mark Rogers
la source
1
Les drapeaux d’entités peuvent être coûteux (450 millions USD en 45 minutes). Cet exemple est également mentionné par Oncle Bob (mais sans aucune technique (comme on pourrait s'y attendre)).
Peter Mortensen
1
Ouais, il y a la surcharge de les retirer éventuellement, bien que ce ne soit généralement pas si difficile. On peut les conserver plus longtemps, mais le drapeau fournit une utilisation plus importante. Je suis d’accord si c’est fait au hasard ou sans suivi, alors les choses peuvent mal tourner. Bien que les choses puissent mal tourner lorsqu'une demande de tirage importante devient difficile à analyser. D'autre part, certaines personnes peuvent ne pas être en mesure d'ajouter quelque chose comme un indicateur de configuration à l'application sur laquelle elles travaillent. Généralement, cela aide avec UAT et le déploiement d'une fonctionnalité.
Mark Rogers
3

Dans Refactoring de Martin Fowler, le conseil qu'il donne est de ne jamais laisser une branche dériver de son maître 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.

JohnnyApplesauce
la source
2
Bien Aet Btenez bien les nouvelles révisions radicales du fonctionnement de l'application, elles ne sont pas "terminées" dans le mois Cependant, ils sont également inutiles avant d'avoir terminé ...
paul23
8
Ils ne sont peut-être pas inutiles avant d'être terminés - ils apportent une valeur ajoutée en permettant d'atteindre le plein résultat et en réduisant le travail requis à l'avenir. En utilisant des techniques telles que le basculement des fonctionnalités, la création de branches par abstraction ou simplement la dernière partie de l'interface utilisateur, il devrait être possible de le fusionner en toute sécurité avec le travail incomplet à maîtriser.
BDSL
1
C’est pourquoi il est pratique de redéfinir votre section locale en plus de tout changement dans la branche principale pour un développement à long terme. Gardez votre travail comme si il venait de sortir de la dernière
NKCampbell
2

Une autre option pour les modifications très longues qui peuvent être terminées mais qui ne sont pas prêtes à l'emploi est de les placer derrière un indicateur de fonctionnalité afin qu'elles puissent être fusionnées pour être maîtrisées sans risque de se casser. Ensuite, lorsqu'ils sont prêts à être utilisés, l'indicateur de fonctionnalité peut être supprimé.

Qwertie
la source
1
Feature flags = code zombie (jusqu'à ce que ressuscité)?
Peter Mortensen
@PeterMortensen Eh bien, vous devez viser à enlever les drapeaux dès que possible, mais cela pourrait fonctionner dans certaines situations
Qwertie
3
@PeterMortensen pas si l'indicateur est activé pour au moins une personne
Ian