Issu de mercurial, j'utilise des branches pour organiser les fonctionnalités. Naturellement, je veux également voir ce flux de travail dans mon histoire.
J'ai commencé mon nouveau projet en utilisant git et terminé ma première fonctionnalité. Lors de la fusion de la fonctionnalité, j'ai réalisé que git utilise l'avance rapide, c'est-à-dire qu'il applique mes modifications directement à la branche principale si possible et oublie ma branche.
Donc, penser à l'avenir: je suis le seul à travailler sur ce projet. Si j'utilise l'approche par défaut de git (fusion rapide), mon historique se traduirait par une branche maître géante. Personne ne sait que j'ai utilisé une branche distincte pour chaque fonctionnalité, car au final je n'aurai que cette branche master géante. Cela ne vous semblera-t-il pas professionnel?
Par ce raisonnement, je ne veux pas de fusion rapide et je ne vois pas pourquoi c'est la valeur par défaut. Qu'est-ce qui est si bon?
la source
no-ff
' avec ses "checkpoint commits" qui rompent la bissecte ou le blâme.-no-ff
est rarement une bonne idée, mais peut toujours aider à conserver un historique interne aux fonctionnalités tout en enregistrant un seul commit sur la branche principale. Cela a du sens pour un long historique de fonctionnalités, lorsque vous fusionnez de temps en temps sa progression sur la branche principale.Réponses:
La fusion à avance rapide a du sens pour les branches de courte durée, mais dans une histoire plus complexe , la fusion à avance rapide peut rendre l'historique plus facile à comprendre et faciliter la restauration d'un groupe de validations.
Avertissement : L' avance non rapide a également des effets secondaires potentiels. Veuillez consulter https://sandofsky.com/blog/git-workflow.html , éviter le 'no-ff' avec ses "checkpoint commits" qui brisent la bissecte ou le blâme, et examinez attentivement si ce devrait être votre approche par défaut
master
.(De nvie.com , Vincent Driessen , poste " Un modèle de branchement Git réussi ")
Jakub Narębski mentionne également la config
merge.ff
:L'avance rapide est la valeur par défaut car:
Mais si vous prévoyez un flux de travail itératif sur une branche de sujet / fonctionnalité (c'est-à-dire que je fusionne, je reviens à cette branche de fonctionnalité et ajoute d'autres validations), il est utile d'inclure uniquement la fusion dans la branche principale, plutôt que toutes les validations intermédiaires de la branche de fonctionnalité.
Dans ce cas, vous pouvez finir par définir ce type de fichier de configuration :
Le PO ajoute dans les commentaires:
Jefromi répond:
Plus généralement, j'ajoute:
En fait, lorsque vous considérez le modèle de branche Mercurial, il s'agit essentiellement d' une branche par référentiel (même si vous pouvez créer des têtes anonymes, des signets et même des branches nommées )
Voir "Git et Mercurial - Comparer et contraster" .
la source
feature
branche vers un référentiel public, vous pouvez la rebaser au-dessus dumaster
nombre de fois que vous le souhaitez. Voir stackoverflow.com/questions/5250817/…feature
branchemaster
qui rend ladite histoire linéaire ou non. Une simple fusion rapide va le rendre linéaire. Ce qui est logique si vous avez nettoyé l'historique de cettefeature
branche avant la fusion d'avance rapide, ne laissant que des validations importantes, comme mentionné dans stackoverflow.com/questions/7425541/… .Permettez - moi d'un peu sur un VonC de réponse très complète :
Premièrement, si je me souviens bien, le fait que Git par défaut ne crée pas de commit de fusion dans le cas d' avance rapide est venu de la considération des "référentiels égaux" à une seule branche, où une traction mutuelle est utilisée pour synchroniser ces deux référentiels (un workflow que vous pouvez trouver comme premier exemple dans la plupart de la documentation utilisateur, y compris "Le manuel de l'utilisateur Git" et "Contrôle de version par exemple"). Dans ce cas, vous n'utilisez pas pull pour fusionner une branche entièrement réalisée, vous l'utilisez pour suivre d'autres travaux. Vous ne voulez pas avoir un fait éphémère et sans importance lorsque vous effectuez une synchronisation enregistrée et stockée dans un référentiel, enregistré pour l'avenir.
Notez que l'utilité des branches de fonctionnalités et d'avoir plusieurs branches dans un référentiel unique n'est venue que plus tard, avec une utilisation plus répandue de VCS avec une bonne prise en charge de la fusion et avec l'essai de divers workflows basés sur la fusion. C'est pourquoi, par exemple, Mercurial ne supportait à l'origine qu'une seule branche par référentiel (ainsi que des conseils anonymes pour le suivi des branches distantes), comme le montrent les anciennes versions de "Mercurial: The Definitive Guide".
Deuxièmement, lorsque vous suivez les meilleures pratiques d'utilisation des branches de fonctionnalités , à savoir que les branches de fonctionnalités doivent toutes commencer à partir d'une version stable (généralement de la dernière version), pour pouvoir sélectionner et sélectionner les fonctionnalités à inclure en sélectionnant les branches de fonctionnalités à fusionner, vous ne sont généralement pas en situation d'avance rapide ... ce qui rend ce problème théorique. Vous devez vous soucier de la création d'une véritable fusion et non d'une avance rapide lors de la fusion d'une toute première branche (en supposant que vous ne placez pas les modifications à validation unique directement sur 'master'); toutes les autres fusions ultérieures sont bien entendu en situation de non-avance rapide.
HTH
la source