web-dev-qa-db-fra.com

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

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é?)?

17
Utkarsh Sinha

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 mainteneurs, 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 pas avant 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 d'après votre question que vous savez que vous n'intégrez pas vos changements assez souvent, donc l'OMI ne sert à rien de danser autour de la question.

À 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 maître, le modèle typique et éprouvé consiste à utiliser un branche instable - parfois appelée branche de développement , comme décrit dans ne branche Git réussie modèle . Si les développeurs ne parviennent pas à fusionner avec succès dans cette branche (qui n'a besoin que de construire , ne pas fonctionner correctement) au moins une fois par jour, alors vous avez une qualité/un problème de discipline et non 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 distincts 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 intégration continue, pas contre.

16
Aaronaught

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 d'autres développeurs

git checkout dev-A
git merge dev-B

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

16
scaryrawr

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 précisément 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 transférez les 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.