web-dev-qa-db-fra.com

Dans Mercurial, quelle est la différence entre la greffe de mercure et le rebase de mercure

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?

29
Peter

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.

34
Ed Cottrell