67 votes

Quelle est la différence entre hg tag et hg bookmark ?

Quelle est la différence entre un étiquette et un signet dans Mercurial ? Je n'arrive pas à trouver de discussion sur les différences entre les deux.

3 votes

Ce guide sur les branches dans Mercurial peut vous être très utile : stevelosh.com/blog/2009/08/a-guide-to-branche-in-mercurial

33voto

gizmo Points 8528

Considérons votre référentiel comme un " choisir ses propres livres d'aventure "avec des points de vue différents.

  • A étiquette est comme un cachet que l'éditeur appose sur votre manuscrit pour dire "ok, nous gardons une tracer de votre travail actuel, au cas où il se passerait quelque chose".
  • A Branche nommée serait un chapitre. Vous devez choisir à un moment donné quel chapitre vous devrez écrire, et ils sont là pour rester. Certains reviendront, d'autres se termineront (désolé, vous êtes mort).
  • A signet est un signet. Il vous suit pendant que vous lisez (engagez) le livre. Il vous aide à garder une trace de "ce que vous lisiez à ce moment-là", afin que vous puissiez les supprimer, les déplacer vers un autre "chapitre". Lorsque vous partagez le livre (push), vous ne partagez généralement pas vos signets, sauf si vous le souhaitez explicitement. Vous les utilisez donc généralement sur branches anonymes parce que leur cycle de vie est plus court que celui des branches nommées.

9 votes

Une analogie inattendue O_O

38 votes

Je ne comprends pas cette analogie. Est-ce moi qui écris le livre ou est-ce moi qui lis un livre que quelqu'un d'autre écrit ? La version de l'éditeur contrôle-t-elle les manuscrits ? Appose-t-il son cachet sur ma copie ou sur la sienne ? Est-ce que j'écris des manuscrits, que je les photocopie ? J'y travaille avec du tippex ? Est-ce que je le fais sur ordinateur et que je le versionne d'une manière ou d'une autre ?

20 votes

Cette analogie est assez confus et mériterait d'être affiné. Essayez ceci. Vous lisez un livre. 1 page = 1 jeu de modifications. * A étiquette est de coller une note sur une page que vous trouvez intéressante. Il reste sur la même page et peut être utilisé pour retrouver facilement cette page. * A Branche nommée est un chapitre. Chaque page porte un numéro de chapitre écrit dans la marge. Ce numéro regroupe les pages apparentées. * A signet est un signet. Lorsque vous passez d'une page à l'autre, vous déplacez le signet avec vous. Vous pouvez utiliser plusieurs signets pour suivre votre progression dans les différentes parties du livre.

24voto

Matthew Flaschen Points 131723

Les signets sont utilisés lorsque vous souhaitez disposer d'un moyen mnémotechnique (foo_feature) qui vous renvoie à un numéro de livraison changeant au fur et à mesure de l'avancement de votre travail. Ils sont plus légers que les branches Mercurial classiques, et ressemblent un peu à la façon dont fonctionnent les branches git.

Les étiquettes renvoient généralement à des identifiants de livraison fixes. Ils peuvent être réattribués manuellement, mais cela est déconseillé.

0 votes

Plus léger ? Je suis confus, venant principalement de svn où les branches et les tags sont juste des conventions différentes pour la même implémentation.

1 votes

@Jason, c'est un peu délicat. Je ne pense pas avoir vraiment compris avant de connaître suffisamment git pour comparer. Cependant, l'idée de base est qu'avec les branches lourdes, le nom de la branche est une propriété (immuable) du changeset. Avec les branches légères, le nom de la branche est une propriété (immuable) du changeset. alias pour un jeu de modifications particulier. Je recommande de lire Branche y GitConcepts tous deux sur le wiki Mercurial.

24voto

Il existe en fait cinq concepts avec lesquels il est possible de jouer :

  • étiquettes
  • étiquettes locales
  • signets
  • branches légères
  • branches nommées

Les branches légères sont le résultat de l'utilisation de mercurial. L'historique de votre dépôt bifurque et parfois fusionne au fur et à mesure que vous changez des choses et que vous vous déplacez dans votre historique.

Les quatre autres sont des moyens d'annoter les branches légères et les ensembles de modifications qui les composent.

Les branches nommées et les étiquettes sont des concepts propres à mercurial où les noms de branches et les étiquettes sont enregistrés dans le référentiel en faisant plus de commits dans le référentiel. Ils ont tendance à se propager dans d'autres référentiels d'une manière qui n'est pas nécessairement évidente.

Les étiquettes locales et les signets ressemblent beaucoup plus à ce que git appelle les étiquettes et les branches. Ce sont des métadonnées plutôt que des objets versionnés. Ils ne sont donc pas représentés comme faisant partie de l'historique du dépôt. Ils ont tendance à être locaux à votre dépôt, et ne se propagent pas à moins que vous ne les propagiez délibérément.

Du moins, je pense que c'est ainsi qu'ils fonctionnent tous. Après environ douze mois d'utilisation quotidienne de mercurial, je n'ai pas vraiment réussi à comprendre son ou ses modèles. Si quelqu'un en sait plus que moi, n'hésitez pas à modifier cette réponse pour qu'elle soit correcte.


Comment j'utilise ces éléments dans la pratique.

Je travaille sur un seul dépôt partagé avec environ 20 autres personnes. Je fais beaucoup d'expériences et de branches légères dans mon propre dépôt privé, qui ne sont jamais poussées vers notre dépôt central principal. Occasionnellement, une fois qu'une expérience a fonctionné, je modifie la ligne principale et pousse un jeu de modifications dans le dépôt central, à partir duquel il trouvera son chemin vers la machine de tout le monde.

Il m'arrive de pousser des changesets à un collègue s'il fait partie des personnes qui sont à l'aise avec le fonctionnement de mercurial. Mais plusieurs personnes en ont un peu peur et préfèrent que je leur envoie des diffs qu'ils peuvent appliquer avec patch.

Pour les expériences que je prévois de courte durée et privées, je laisse les branches légères suivre leur cours et je me souviens de ce qui se passe. Si je sens que ma mémoire flanche à propos d'une brindille qui existe depuis un certain temps, je la mets en signet.

J'utilise des étiquettes locales pour marquer les révisions auxquelles j'aimerais revenir un jour. Elles facilitent la recherche d'états antérieurs intéressants.

Pour ma part, je ne fais presque jamais de balises non locales ou de branches nommées (sauf par accident, et je les détruis si je le fais). Mais nos responsables des versions le font. Nos versions majeures ont toutes leurs propres branches nommées en dehors de la ligne principale, et les versions mineures ont des étiquettes sur ces branches. Cela permet de s'assurer que ces branches et ces étiquettes importantes sont identiques pour tout le monde.

Encore une fois, je ne sais pas si c'est ainsi que l'on est censé utiliser mercurial, mais il semble que ce soit un modèle qui fonctionne bien pour la taille de notre équipe.

Si trois ou quatre d'entre nous voulaient collaborer à une expérience, cela vaudrait probablement la peine de créer une branche nommée, que nous partagerions probablement entre nous mais que nous ne pousserions pas vers le repo central. Je ne sais pas si cela fonctionnerait bien !

1 votes

Vous pourriez envisager d'utiliser hg-flow, qui est très utile.

0 votes

Que se passe-t-il si vous créez une branche de fonctionnalité ou un signet et que cette fonctionnalité n'est jamais fusionnée dans le master ? Quelle est la meilleure pratique à ce stade si l'on veut nettoyer le repo ?

12voto

Ry4an Points 56453

La principale différence réside dans le fait qu'un signet est automatiquement avancé lorsque vous vous engagez. Voici un exemple :

hg init
..edit a file..
hg commit -m 'my commit' # creates revision 0
hg tag -r 0 mytag     # creates revision 1
hg bookmark -r 0 mybookmark   # doesn't create a revision
hg update 0   # get back to r0
..edit a file..
hg commit -m 'another commit'  # creates revision 2

À ce stade, mytag pointe toujours sur la révision 0 et mybookmark sur la révision 2. De plus, l'étiquetage a créé un jeu de modifications, ce qui n'est pas le cas du signet.

De plus, le signet a bien sûr créé une revisio

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X