Faire passer les modifications du maître à ma branche de travail?


16

Nous sommes deux à travailler sur quelque chose. Nous utilisons cette structure de branche

  • Maître
  • dev-A
  • dev-B

Nous travaillons tous les deux sur des branches distinctes (dev-A, B) et chaque fois que nous avons terminé - nous promouvons nos changements à master.

Mais l'inconvénient est que nous ne pouvons pas obtenir les modifications apportées par l'autre développeur. Tout existe dans l'arborescence principale - mais nous ne pouvons pas obtenir les dernières mises à jour effectuées par l'autre développeur.

Existe-t-il un moyen de résoudre ce problème ou devons-nous changer la structure de notre branche (par fonctionnalité?)?

Réponses:


16

J'ai vu des branches de développeurs utilisées dans deux scénarios principaux:

  1. La communauté open source, où ces branches sont en fait des fourchettes de référentiel, afin que les responsables de projet puissent verrouiller l'accès au référentiel maître et nécessiter une intégration via des demandes d'extraction. Cela rend la vie plus difficile pour les contributeurs, mais beaucoup plus facile pour les responsables, ce qui est bien sûr exactement le point, et c'est un modèle très réussi sur GitHub.

  2. Des équipes et des organisations qui n'ont pas d'intégration continue et qui ont un historique d'instabilité dans leurs déploiements, ou pire, d'instabilité dans leurs builds. Ces équipes essaient généralement d'utiliser les branches de développement pour protéger la stabilité de la ligne principale, et le résultat est - généralement - une période de fusion longue et très douloureuse avant la sortie, suivie d'une période de stabilisation encore plus longue et plus douloureuse, qui parfois n'arrive qu'après la sortie.

Je ne veux pas que ce soit une diatribe sur la raison pour laquelle vous avez besoin de CI, mais il est clair à partir de votre question que vous savez que vous n'intégrez pas vos changements assez souvent, donc OMI, il est inutile de danser autour du problème.

À moins que vous ne travailliez réellement dans une équipe distribuée géographiquement avec un besoin de «filtrer» les changements des développeurs externes, le modèle de branche par développeur n'a vraiment pas beaucoup de sens. Cela n'a surtout pas de sens avec git, car chaque développeur a déjà techniquement son propre référentiel. La plupart des organisations devraient intégrer très fréquemment - comme dans, plusieurs fois par jour.

Je fais actuellement partie d'un groupe d'environ 35 contributeurs répartis en 4 équipes distinctes, la plupart des gens s'enregistrent au moins 2-3 fois par jour, certaines personnes 10-15 fois; il est inhabituel de voir des versions cassées et extrêmement rares pour elles de rester cassées pendant plus de quelques minutes. Git gère les fusions si facilement la plupart du temps que les branches de développeurs distantes ne sont que des frais généraux inutiles. Tirez, fusionnez localement et exécutez des tests de validation avant de pousser, c'est simple.

Si vous devez absolument différer l'intégration afin de protéger la stabilité de la branche principale, le modèle typique et éprouvé consiste à utiliser une branche instable - parfois appelée branche de développement , comme décrit dans Un modèle de branchement Git réussi . Si les développeurs ne parviennent pas à fusionner avec succès dans cette branche (qui n'a besoin que de se construire , pas de fonctionner correctement) au moins une fois par jour, alors vous avez un problème de qualité / discipline et pas un problème de contrôle des révisions; le couvrir en utilisant des branches de développeur non intégrées ne fait que différer le problème et, ce faisant, rend les éventuelles fusions beaucoup plus douloureuses et instables qu'elles ne le devraient vraiment.

Les branches de fonctionnalités ne sont pas les pires, mais très peu de projets de l'OMI sont en fait assez grands pour les justifier; si votre projet est très volumineux (c'est-à-dire que des tonnes de fonctionnalités sont travaillées en même temps), vous obtiendrez de meilleurs résultats en le divisant en composants autonomes séparés que vous ne le constaterez en résolvant le problème avec le contrôle de source.

Vous pouvez ignorer ce conseil si vous le souhaitez, et de nombreuses équipes le font, mais l'une des raisons pour lesquelles le modèle de branchement lié ci-dessus est si populaire et réussi est qu'il est conçu pour fonctionner avec une intégration continue, et non contre lui.


Je pense que l'importance d'une intégration continue ne peut pas être suffisamment soulignée, à la fois dans le sens de tout intégrer dans une seule branche, et dans le sens de builds quotidiens / horaires (en utilisant Jenkins ou similaire).
sleske

15

Dans votre branche de travail si vous allez:

git commit -am "Committing changes before merge"
git merge master

vous pouvez également fusionner à partir de la branche des autres développeurs

git checkout dev-A
git merge dev-B

Ce que cela fera, c'est de fusionner les modifications de master dans votre branche de développement.


Oui - c'est une façon. J'espérais que git aurait un flux de travail élégant pour cela.
Utkarsh Sinha

2
Eh bien, git fonctionne généralement mieux si chaque développeur a son propre référentiel de travail local et un référentiel central partagé que les développeurs poussent et tirent. De cette façon, vous pouvez chacun travailler dans les mêmes branches et obtenir des mises à jour en tirant et en mettant des modifications en poussant vers le référentiel central. C'est probablement l'élégance que vous recherchez. git gérera automatiquement la fusion pour vous sauf en cas de conflit. git flow est un bon ajout pour le workflow.
scaryrawr

Perfecto. Il y a quelques réponses très longues à cette question exacte à quelques endroits, mais git merge masteralors que sur la branche des fonctionnalités extraites, c'est ce que je cherchais. Merci
Drenai

3

Si dev-A et dev-B sont des branches différentes pour un projet différent, alors ce que @scaryrawr a répondu serait le mieux.

Mais si dev-A et dev-B sont en fait exactement le même code (même projet), alors une alternative serait que les deux travaillent sur l'une des branches. Par exemple, vous créez un branchement maître appelé «devWork». Vous extrayez tous les deux devWork, travaillez dessus, validez et envoyez des modifications. Les modifications poussées ne seraient pas sur Master mais dans devWork, alors les autres utilisateurs de la branche doivent simplement faire un PULL localement pour obtenir les modifications poussées.

Vous pouvez ensuite suivre les méthodes standard pour effectuer le travail sur devWork vers Master, etc.

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.