Les conflits de fusion compliqués fréquents sont-ils un signe de problèmes?


35

Dans notre équipe, nous utilisons Git comme contrôle de source. Nous avons plusieurs domaines de code presque indépendants mais qui se chevauchent parfois. Dernièrement, nous avons discuté des workflows et des approches pour utiliser le contrôle de source. Une des plaintes qui se pose lorsque je préconise l’utilisation d’un flux de travaux de branche de fonctionnalités est que les personnes se heurtent souvent à des conflits de fusion compliqués qu’elles ne résolvent pas correctement. Par compliqué, je veux dire "pas évident quant à la façon de résoudre". À la lumière de cela, d’autres flux de travail sont utilisés plus activement, tels que les flux de travail basés sur le "ré-extraction".

En tant que défenseur de l'approche par branche, je ne reçois pas vraiment la plainte. Oui, vous devez garder vos branches de fonctionnalités locales à jour depuis le maître ou ailleurs, mais c'est à peu près le seul problème que je vois. Je pense que si vos fusions sont toujours compliquées et peuvent avoir des effets secondaires, alors c'est plus un problème de travail d'équipe qu'un problème de Git.

Ai-je raison de penser cela? Les conflits de fusion compliqués sont-ils un signe de bon ou de mauvais?


1
Combien de temps les fonctionnalités durent-elles? Dans quelle mesure le code est-il modulaire? Pourriez-vous (par exemple), choisir cherry dans la validation du code de test (cela a été fait en premier, et séparé du code réel, non?) Pour voir comment la fonctionnalité a changé?

@MichaelT La base de code est pour notre base de code de test automatisé. Nous sommes sur le point de commencer à travailler sur une nouvelle addition à notre projet qui nécessitera probablement un développement parallèle pendant un moment. D'où la discussion sur les branches par rapport aux autres.
joshin4colours

7
Est-ce que les gens rencontrent ce genre de problème ou craignent-ils seulement que ces problèmes apparaissent?
Christopher Creutzig

2
En passant, ce tutoriel IMPRESSIONNANT auquel vous avez
accédé

1
Réinitialiser la branche de caractéristique ou la fusionner avec le tronc entraîne des fusions similaires. Rebaser réellement fait plus de fusion et en tant que tel est plus susceptible de créer de mauvais conflits. Ce qui compte, c'est combien de fois c'est fait.
Jan Hudec

Réponses:


23

Ce n'est pas impossible que le problème soit votre code. Si votre base de code a beaucoup d'interrelations entre les modules, alors chaque changement aura des vrilles partout, et chaque développeur interagira avec le code de quelqu'un d'autre, ce sera un cauchemar.

J'aurais tendance à penser que vous remarqueriez cela d'une autre manière, mais il est possible que vous soyez tellement habitué à cela que vous ne le voyez plus.


9
Il s'agissait de ma première pensée. Des conflits de fusion complexes se produisent lorsque plusieurs modifications sont apportées au même code. Si vous avez un projet assez jeune, cela est courant, mais si vous avez une base de code de bonne taille, cela pourrait être un signe d '"objets divins" ou le fait que certains modules / classes en font trop et doivent être restructurés. Cela peut également provenir de commetteurs trop zélés ayant commis des dizaines de petits changements, mais cela est moins courant.
TMN

1
Le fait que notre base de code soit quelque peu "jeune" (environ 6 mois, passé en revue plusieurs refactors majeurs) pourrait en être un indicateur.
joshin4colours

10
@ joshin4colours Si vous effectuez une refactorisation alors que quelqu'un écrit une fonction importante, vous aurez des problèmes.
Sean McSomething

17

Je suis habitué au workflow "fetch-rebase-push". Quel est en fait le premier flux de travail, le plus primitif, décrit dans votre tutoriel? Voici les avantages:

  • Véritable intégration continue
  • Gestion précoce des conflits - juste après avoir écrit et testé le code
  • Réponse rapide - "-Hey, Bob, l'interpolation cubique que tu as écrite donne une sortie amusante, peux-tu la regarder pendant que je suis en train de déjeuner?"
  • Aucune fusion ne s’engage - effacez la chronologie comme si un développeur écrivait everithyng

Maintenant, concernant les conflits de fusion compliqués. Je ne comprends pas comment on pourrait expérimenter des fusions fréquentes et compliquées. La complication découle du fait que l’on n’a pas rebasé / piqué au hasard pendant une longue période et qu’on a travaillé sur cette seule caractéristique pendant un mois.

Personnellement, je préférerais m'occuper de conflits de fusion fréquents et faciles (plutôt que de rebases) plutôt que de rares, d'horreur de fusion englobante.


1
Excellente description d'un bon flux de travail Git, mais cela ne répond pas tout à fait à ma question.
joshin4colours

2
@ Joshy c'est vrai. Seul le paragraphe du milieu répond en quelque sorte à votre question. Mais voici une réponse directe. Si la fusion est fréquente et difficile, il s'agit certainement d'un indice de problème de flux de travail / problème de communication / problème d'architecture / division ou de problème de rôles.
Vorac

7

Les fusions et les rebases doivent provoquer exactement les mêmes conflits, pour les conflits inhérents qu'un humain doit résoudre (c'est-à-dire que deux développeurs changent la même ligne de code). Pour les autres conflits, les fusions ont tendance à être plus propres, car vous ne modifiez pas le SHA-1 des commits dans tous les sens. Je ne sais pas comment vous parvenez à entrer dans un état où les fusions causent plus de conflits que de rebaisonnements, mais cela indique certainement que le flux de travail de certaines personnes est perturbé et qu'elles ont probablement besoin de plus de formation sur le fonctionnement de git. Suppriment-ils les commits de fusion d’autres personnes lorsqu’elles effectuent leurs rebases locales, ou quelque chose du genre?

L’avantage et l’inconvénient de la méthode pull-rebase est qu’elle ressemble beaucoup aux workflows centralisés auxquels beaucoup de gens sont habitués. Vous n'avez pas besoin de comprendre les branches pour pouvoir les utiliser.

Quoi qu'il en soit, il est parfaitement possible de créer un flux de travail de branche fonctionnelle uniquement localement, si vous ne pouvez pas y faire adhérer d'autres personnes.


5

Le projet sur lequel je travaille a ce type de problème de temps en temps et semble résulter de plusieurs facteurs:

  • Nous utilisons Visual Studio et des fichiers tels que Visual Studio .sln ne sont que des documents XML (qui ne répondent pas bien aux fusions textuelles) remplis de guides (que Git ne peut pas comprendre mieux que le reste d'entre nous) et peuvent facilement être utilisés. mal fusionné et entraîne la perte de fichiers.
  • Certaines personnes travaillent sur des zones similaires du code, de sorte que les modifications apportées soient imbriquées les unes à côté des autres dans les classes. Bien que inévitable dans cette situation, ce type de configuration sera un travail très difficile pour tout système de contrôle de source. Même si vous avez une excellente communication dans votre équipe, parfois, les gens ne réalisent pas qu'ils se heurtent au code de l'autre et que des conflits surgissent.

Je suis intéressé par le potentiel de Semantic Merge pour résoudre certains de ces problèmes, mais ce n'est évidemment utile que si vous travaillez dans une langue qu'il peut analyser et que je n'ai pas encore rencontré de défi significatif. Je ne l’utilise pas, je ne peux donc pas garantir son efficacité.


4

À moins que les développeurs ne modifient les validations historiques (au lieu des fusions pures), les conflits dans un modèle git de type de flux de travaux d'entité sont le signe d'une affectation de base de code étroitement liée (/ brandnew codebase) ou de chevauchement.


0

Vous avez une branche principale (principale) et tout le monde travaille dans ses branches principales.

Travailler dans les branches de fonctionnalités peut prendre de quelques heures à quelques mois.

De temps en temps, quelqu'un va inverser la fusion de son jeu de modifications dans la branche principale. Votre chef d'équipe doit s'assurer qu'une seule personne effectue une fusion inversée à la fois. Une fois que cela est fait, vous devez transférer la fusion de la branche principale vers votre branche. Une fois que tout le monde a fusionné, une autre personne peut être autorisée à inverser la fusion dans la branche principale. Sinon, trop de modifications seront fusionnées de manière inverse et vous aurez des tonnes de conflits de fusion lors de votre fusion en aval.

Juste pour clarifier la terminologie, par «fusion inverse», je veux dire une fusion de branche fonctionnelle en une branche principale, et par «fusion avancée», je veux dire une fusion de branche principale en une branche fonctionnelle. D'après ce que j'ai vécu auparavant, vous constaterez probablement davantage de conflits de fusion lors de la fusion inverse, par opposition à la fusion en aval.


1
La fusion dans la branche principale ne doit jamais avoir de conflit. Vous fusionnez toujours le principal pour le premier en premier, de sorte que fonctionnalité pour principal est alors sans conflit.
gnasher729

@ gnasher729 - Je pense que c'est ce que dit cette réponse. Je suggère que chaque développeur passe d'une branche principale à une autre à chaque fois que quelqu'un commet une modification à la principale, de sorte que tous les conflits soient immédiatement résolus dans les branches principales.
Periata Breatta

Il a dit "vous êtes plus susceptible d'avoir des conflits fusionnant d'une fonctionnalité à une autre"
gnasher729

0

Deux choses qui peuvent aider: Premièrement, évitez les outils qui apportent des modifications par eux-mêmes. Deux développeurs utilisant des paramètres d’onglet différents sont une recette pour un désastre. Deuxièmement, apportez des modifications à différents endroits. Vous rencontrez un problème, par exemple, si trois développeurs ajoutent du code à la fin du même fichier, ce qui est bien mieux s'ils ajoutent du code à des endroits différents.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.