Je sais Rebase est une extension (groupée), tandis que Graft est une fonctionnalité de base (qui a remplacé l'extension Transplant (groupée)).
graft
est documenté comme:
copier les modifications d'autres branches dans la branche actuelle
Cette commande utilise la logique de fusion de Mercurial pour copier les modifications individuelles d'autres branches sans fusionner les branches dans le graphique d'historique. Ceci est parfois appelé "rétroportage" ou "cueillette".
rebase
est documenté comme:
Rebase permet de déplacer les commits dans l'histoire de Mercurial (en utilisant une série de fusions internes). Cela a de nombreuses utilisations:
- déplacement des changesets entre les branches
- histoire de la "linéarisation"
- réorganisation des changesets
- réduction de plusieurs modifications en un seul ensemble de modifications
Les deux semblent utiliser la fusion pour déplacer ou copier les changements entre les branches.
Copies de greffe. Rebaser les mouvements. Mais rebase --keep
copies.
Il m'arrive souvent de réaliser mon objectif de copier un ensemble de modifications dans un sens ou dans l'autre. Est-ce important celui que j'utilise? Quand devrais-je préférer l'un à l'autre?
Par exemple. la greffe ne doit-elle être utilisée que lors de la copie vers une autre branche nommée? Ou seulement lorsqu'il n'y a qu'un seul ensemble de modifications?
Edit: Se pourrait-il que le rebase soit un sur-ensemble de graft potentiellement dangereux, mais ne peut être utilisé qu'avec les ensembles de modifications draft
pendant le développement pour l'édition de l'historique local, tandis que graft est un sous-ensemble sûr de rebase qui peut être utilisé avec public
changesets pendant la maintenance pour le backporting?
hg graft
autorise la "sélection des cerises", comme vous l'avez indiqué dans votre question. Par exemple, vous pouvez exécuter hg graft -D "2085::2093 and not 2091"
pour copier uniquement certaines modifications d'une autre révision. Par comparaison, hg rebase
(avec ou sans --keep
) récupérera tous les changements que vous spécifiez et tous ses changements décents.
De plus, rebase
vous permet de réduire les ensembles de modifications (avec --collapse
). Pour autant que je sache, graft
ne fonctionne pas.
Une autre différence que j'ai remarquée: hg graft --edit 123
vous permet de greffer la révision 123 dans le répertoire de travail et de modifier le message de validation. Je ne trouve pas de hg rebase
équivalent. Je dois cependant souligner que hg histedit
permet également de modifier le message de validation lors du rebasage.
Il y a probablement d'autres différences auxquelles je ne pense pas. SO communauté: n'hésitez pas à les signaler dans les commentaires, et je serai ravi de réviser cette réponse pour la rendre plus complète.
Voir la documentation graft
et la documentation Rebase Extension pour plus de détails.