Git fusion correctif à plusieurs branches
J'ai été d'essayer d'envelopper ma tête autour de git modèles de ramifications. J'ai été à la recherche à http://nvie.com/posts/a-successful-git-branching-model/ pour quelques idées et à venir de la Subversion seule chose dont j'étais vraiment impatient de a été de faire un changement dans un seul lieu et de la fusion de toutes les branches qui en avait besoin. Dans Subversion, nous avons fini par faire beaucoup de copie de code autour de.
Cependant, je ne comprends toujours pas ce complètement. Ici, c'est un type standard de flux de travail que j'ai et il y a toujours des conflits.
# create new version branch
git checkout master
git checkout -b v3
vim pom.xml # change branch version to "3.1-SNAPSHOT"
git commit -a
git checkout master
vim pom.xml # change master version to "4.0-SNAPSHOT"
git commit -a
Donc le maître est à 4.0-INSTANTANÉ et la branche est à 3.1-INSTANTANÉ.
Pas je veux créer un correctif sur la branche et le déplacer vers le tronc.
git checkout v3
git checkout -b hotfix
vim file.txt # make a bugfix change
git commit -a
git checkout v3
git merge hotfix # this works fine
git checkout master
git merge hotfix # this has a conflict since both branches have changed the version
Je comprends pourquoi sa passe et c'est logique. Est-il une meilleure manière de faire ceci?
J'ai lu à propos de cherry-pick, qui je l'ai testé et fonctionne:
git checkout v3
git cherry-pick a518b0b75eaf28868
git checkout master
git cherry-pick a518b0b75eaf28868
Toutefois, cela ne semble pas être la "bonne" façon de gérer cela. Des suggestions?
Vous devez vous connecter pour publier un commentaire.
Vraiment, votre réponse dépend si vous voulez que vos arbres basé sur la même histoire... Par exemple, 4.0 est basé sur les 3 derniers.X + tous les changements dans la version 4.0...
Personnellement, je ne le recommande pas une fois que vous décidez de commencer une nouvelle branche(s) pour une nouvelle version(s). Et à un moment donné du temps, le logiciel est en prenant une direction différente, de sorte que vos branches devraient également.
Cela laisse
git cherry-pick
que votre solution idéale. Faire le changement quelque soit la branche la plus logique, et puis cerise chercher pour les anciennes versions. C'est le même que si vous aviez vérifié la vieille branche et manuellement appliqué le même changement, et fait un nouveau commit. Il le maintient propre et au point.Git merge ou rebase allons essayer d'intégrer les branches de l'histoire, chacun à leur manière, dont je soupçonne que vous ne voulez pas lorsque le portage de corrections de bugs, etc...
Si vous vouliez obtenir des super-technique à ce sujet, vous pouvez créer le correctif à partir d'un ancêtre commun:
La
--no-ff
drapeau est-il de souligner que Git va créer une fusion de commettre, en gardant lahotfix
branche sur l'étiquette du correctif de la pointe, au lieu de tirer l'étiquette dev3
oumaster
. (Vous pouvez omettre le drapeau et obtenir le même comportement, depuis lehotfix
branche a un commit qui n'est pas dansmaster
ouv3
. Plus d'infos dans les docs.)Personnellement, je pense que c'est exagéré. J'irais avec gahooa: faire le correctif sur la branche qui fait sens, puis de fusionner ou de choisir en fonction de comment vous voulez que les branches se rapportent les uns aux autres.
merge-base
,--no-ff
et tous les bons conseils.cherry-pick
crée de nouvelles commettre: même diff, message, timestamp, mais hachage différent. Si effacer l'historique est important, je ne pense pas que fusion-base est un overkill à tous. Cherry picking de travail pour les cas simples, mais méfiez-vous des choses de ce genre: news.ycombinator.com/item?id=3947950--no-ff
ne devriez avoir aucun effet surhotfix
. Il racontegit merge
toujours de créer une fusion de commettre, au lieu de simplement déplacer l'extrait de référence (v3
oumaster
) pour pointer vers la même livraison quehotfix
. À l'aide d'un diagramme de scénario, cela ne devrait pas arriver de toute façon ce ne peut avancer rapidement si le commit, vous êtes la fusion est un descendant direct de la livraison, vous avez actuellement sélectionnée. Il ne ferait que déplacerv3
oumaster
siancestor
est en faitv3
oumaster
, respectivement.Dans le cas, vous travaillez sur la branche "4.0" et doivent faire un correctif sur "3.1", vous pouvez rebase "4.0" après la validation de "3.1":
Assurez-vous que vous êtes sur la branche 4.0:
Enregistrer le travail en cours de sorte que vous pouvez voir d'autres de la direction de la
Faire l'édition et de s'engager:
Récupérer vos modifications:
Changement 4.0 donc les branches de l'actuel chef de l' "3.1":
J'ai eu du mal avec cette question, aussi, et je pense que si vous êtes prêt à changer votre stratégie de gestion des versions un peu (c'est à dire, s'écarter de l'INSTANTANÉ versions de Maven encourage), ce pourrait être résolu en utilisant une version fixe (instantanée ou 0.0.0-INSTANTANÉ) sur le master (ou quel que soit votre branche de développement est). (L'INSTANTANÉ suffixe est important, si vous utilisez Maven, depuis Maven traite INSTANTANÉ-versionnées artefacts différente de celle des autres.)
En fait, je pense que vous auriez souhaitez mettre en place une politique de jamais changer le numéro de version sur votre branche de production (celle à partir de laquelle vous construisez des rejets) ou sur les branches qui sont aux fins de la mainlevée (par exemple, en changeant les numéros de version) et que vous ne voulez jamais à fusionner dans la branche de développement.
Je n'ai pas réellement utilisé cette stratégie, mais a juste à y penser, et je pense que je vais commencer à tester.