Les deux rebase
(et cherry-pick
) merge
ont leurs avantages et leurs inconvénients. Je plaide pour merge
ici, mais cela vaut la peine de comprendre les deux. (Recherchez ici une autre réponse bien argumentée énumérant les cas où cela rebase
est préférable.)
merge
est préférable à cherry-pick
et rebase
pour plusieurs raisons.
- Robustesse . L'identifiant SHA1 d'un commit l'identifie non seulement en lui-même mais également par rapport à tous les autres commits qui le précèdent. Cela vous offre une garantie que l'état du référentiel à un SHA1 donné est identique pour tous les clones. Il n'y a (en théorie) aucune chance que quelqu'un ait fait ce qui ressemble au même changement, mais qu'il corrompe ou détourne votre référentiel. Vous pouvez choisir parmi les modifications individuelles et elles sont probablement les mêmes, mais vous n'avez aucune garantie. (En tant que problème secondaire mineur, les nouveaux commits sélectionnés par les cerises prendront de l'espace supplémentaire si quelqu'un d'autre sélectionne par les cerises dans le même commit, car ils seront tous deux présents dans l'historique même si vos copies de travail finissent par être identiques.)
- Facilité d'utilisation . Les gens ont tendance à comprendre
merge
assez facilement le flux de travail. rebase
a tendance à être considéré comme plus avancé. Il est préférable de comprendre les deux, mais les personnes qui ne veulent pas être des experts en contrôle de version (ce qui, selon mon expérience, a inclus de nombreux collègues qui sont sacrément bons dans ce qu'ils font, mais ne veulent pas passer du temps supplémentaire) ont plus facilement le temps fusionnant.
Même avec un workflow lourd de fusion rebase
et cherry-pick
sont toujours utiles dans des cas particuliers:
- Un inconvénient
merge
est l'histoire encombrée. rebase
empêche une longue série de commits d'être dispersés dans votre histoire, comme ils le seraient si vous fusionniez périodiquement dans les changements des autres. C'est en fait son objectif principal lorsque je l'utilise. Ce que vous voulez faire très attention, ce n'est jamais rebase
coder que vous avez partagé avec d'autres référentiels. Une fois la validation effectuée, push
quelqu'un d'autre aurait pu commettre dessus, et le rebasage entraînerait au mieux le type de duplication décrit ci-dessus. Au pire, vous pouvez vous retrouver avec un référentiel très confus et des erreurs subtiles qu'il vous faudra beaucoup de temps pour dénicher.
cherry-pick
est utile pour échantillonner un petit sous-ensemble de modifications à partir d'une branche de sujet que vous avez décidé de supprimer, mais vous avez réalisé qu'il y a quelques éléments utiles.
Quant à préférer la fusion de nombreux changements à un seul: c'est juste beaucoup plus simple. Il peut être très fastidieux de fusionner des ensembles de modifications individuels une fois que vous en avez beaucoup. La résolution de fusion dans git (et dans Mercurial et dans Bazaar) est très très bonne. Vous ne rencontrerez pas de problèmes majeurs lors de la fusion de branches même longues la plupart du temps. Je fusionne généralement tout en une seule fois et ce n'est que si j'obtiens un grand nombre de conflits que je sauvegarde et réexécute la fusion au coup par coup. Même alors, je le fais en gros morceaux. Comme exemple très réel, j'ai eu un collègue qui avait 3 mois de modifications à fusionner, et a obtenu quelque 9000 conflits dans 250000 lignes de code. Ce que nous avons fait de fixer est faire la fusion d' un mois de la valeur d'à la fois: les conflits ne construisent pas de façon linéaire, et de faire en morceaux dans les résultats bienmoins de 9 000 conflits. C'était encore beaucoup de travail, mais pas autant que d'essayer de le faire un commit à la fois.
À mon avis, la sélection des cerises devrait être réservée aux rares situations où elle est requise, par exemple si vous avez effectué une correction directement sur la branche `` principale '' (tronc, branche principale de développement) et que vous vous êtes ensuite rendu compte qu'elle devrait également être appliquée à `` maint '. Vous devez baser le workflow soit sur la fusion, soit sur le rebase (ou "git pull --rebase").
N'oubliez pas que la validation sélectionnée ou rebasée est différente du point de vue de Git (a un identifiant SHA-1 différent) de l'original, elle est donc différente de la validation dans le référentiel distant. (Rebase peut généralement gérer cela, car il vérifie l'ID du patch, c'est-à-dire les modifications, pas un ID de validation).
Également dans git, vous pouvez fusionner de nombreuses branches à la fois: ce que l'on appelle la fusion des poulpes . Notez que la fusion de poulpe doit réussir sans conflits. Cela pourrait néanmoins être utile.
HTH.
la source
git blame
bogues : pour trouver le commit qui a introduit le bogue, etgit branch --contains
pour déterminer où fusionner la branche. Décrit plus en détail dans cet articleRebase et Cherry-pick sont le seul moyen de conserver l'historique des validations. Évitez d'utiliser la fusion et évitez de créer un conflit de fusion. Si vous utilisez gerrit, définissez un projet sur Fusionner si nécessaire et un projet sur le mode de sélection et essayez vous-même.
la source