Quelle est la différence entre HG tag et Hg bookmark?
Quelle est la différence entre une balise et un signet dans Mercurial? Je n'arrive pas à trouver de discussion sur la façon dont les deux diffèrent.
4 réponses
Considérons votre référentiel comme un "Choisissez vos propres livres d'aventure", avec différents points de vue.
- une balise est comme un timbre que l'éditeur a mis sur votre manuscrit pour dire " ok, nous gardons une trace de votre travail actuel, au cas où de la merde se produirait."
- Un branche nommée serait un chapitre. Vous devez choisir à un moment donné quel chapitre vous devrez écrire, et ils sont là pour rester. Certains vont fusionner en arrière, certains vont se terminer (Désolé, vous mourir.)
- un signet est, bien, un signet. Il vous suit pendant que vous lisez (commettez) le livre. Il vous aide à garder une trace de "ce que vous lisiez à ce moment-là", de sorte que vous pouvez 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. Donc, vous les utilisez généralement sur branches anonymes parce que leur cycle de vie est plus court que les branches nommées.
Les signets sont utilisés lorsque vous voulez un mnémonique (foo_feature) qui pointe vers un ID de validation changeant au fur et à mesure que votre travail progresse. Ils sont plus légers que les branches Mercuriales régulières, et un peu similaires à la façon dont les branches git fonctionnent.
Les balisesPointent généralement vers des ID de validation fixes. Ils peuvent être réaffectés manuellement, mais cela est déconseillé.
Il y a en fait cinq concepts pour jouer avec:
- balises
- étiquettes locales
- signets
- branches légères
- branches nommées
Les branches légères sont ce qui se passe si vous utilisez simplement mercurial. L'historique de votre référentiel se fourche et fusionne parfois lorsque vous modifiez 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 changesets qui les composent.
Branches nommées et les balises sont des concepts mercuriaux uniquement où les noms de branche et les balises sont réellement enregistrés dans le référentiel en effectuant plus de validations dans le référentiel. Ils auront tendance à se propager à d'autres dépôts d'une manière qui ne sont pas nécessairement évidente.
Les balises et les signets locaux ressemblent beaucoup plus à ce que git appelle les balises et les branches. Ce sont des métadonnées plutôt que d'être mélangées avec les objets versionnés. Ils ne sont donc pas représentés dans l'historique du dépôt. Ils ont tendance à être locaux à votre référentiel, et ne se propagera pas sauf si vous les propagez délibérément.
Au moins, je pense que c'est comme ça qu'ils fonctionnent tous. Après environ douze mois d'utilisation quotidienne de mercurial, Je n'ai pas vraiment compris son(ses) modèle (s). Si quelqu'un sait mieux que moi, alors n'hésitez pas à modifier cette réponse si elle est correcte.
Comment j'utilise réellement ces choses dans la pratique.
Je travaille sur un seul référentiel partagé avec environ 20 autres personnes. Je fais beaucoup d'expériences et léger branches dans mon propre référentiel privé, qui ne sont jamais poussés vers notre référentiel central principal. De temps en temps, une fois qu'une expérience a fonctionné, je vais modifier la ligne principale et pousser un ensemble de modifications dans le référentiel central, à partir duquel il trouvera son chemin vers la machine de tout le monde.
Je vais parfois pousser certains changesets à un collègue s'ils sont l'une des personnes qui est à l'aise avec le fonctionnement de mercurial. Mais plusieurs personnes en ont un peu peur et préfèrent si je leur envoie des diffs qu'elles peuvent appliquer avec le patch.
Pour les expériences que je m'attends à être de courte durée et privées, je laisse juste les branches légères se produire là où elles peuvent, et je me souviens de ce qui se passe. Si je sens que ma mémoire glisse sur une brindille qui existe depuis un moment, je la mets en signet.
J'utilise des balises locales pour marquer les révisions auxquelles je pourrais revenir un jour. Ils rendent les états passés intéressants plus faciles à trouver.
Je ne fais presque jamais de balises non locales ou de branches nommées (sauf par accident, et je détruis si je le fais). Mais nos gens de libération le font. Nos versions majeures publiées ont toutes leurs propres branches nommées hors de la ligne principale, et les versions mineures ont des balises sur ces branches. Cela garantit que ces branches et balises importantes se ressemblent 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 être un modèle qui fonctionne bien pour notre taille d'équipe.
Si trois ou quatre d'entre nous voulaient collaborer à une expérience, ce serait probablement vaut une branche nommée, que nous partagerions probablement entre nous mais ne pousserions pas au repo central. Je ne sais pas à quel point ça marcherait!
La plus grande différence est qu'un signet est automatiquement déplacé vers l'avant lorsque vous validez. 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 moment-là, mytag pointe toujours vers la révision 0 et mybookmark pointe maintenant vers la révision 2. Le marquage a également créé un ensemble de modifications et le signet ne l'a pas fait.
Aussi, bien sûr, le signet créé un revisio