There are actually five concepts:
- tags
- local tags
- bookmarks
- light branches
- named branches
Light branches are what happens if you just use mercury. The story of your fork storage and sometimes merges when you change things and move your story.
The other four are ways to annotate light branches and the sets of changes that create them.
named branches and tags are mercury-based concepts where branch names and tags are actually written to the repository, making more commits to the repository. They will be distributed to other repositories in ways that are not necessarily obvious.
local tags and bookmarks are much more like git invoking tags and branches. This is metadata, not mixing with object versions. Therefore, they are not presented as part of the history of the repository. They are usually local to your repository and will not be distributed unless you intentionally distribute them.
At least I think they all work. After about twelve months using the mercury daily, I could not cope with her model. If someone knows better than me, then feel free to edit this answer so that it is corrected.
How I actually use these things in practice.
I am working on one shared repository with about 20 other people. I do a lot of experiments and light branches in my own repository that never end up in our main central repository. Sometimes, as soon as the experiment has worked, I modify the main line and push the set of changes to the central repository, from which it will find its way for all other machines.
Sometimes I will push some revisions to an employee if they are one of those who can work with Mercurial. But a few people are a little afraid of this and prefer if I send them diffs that they can apply with the patch.
For experiments, I expect to be short-lived and private, I just let the light branches where they can and remember what happens. If I feel that my memory slides around a branch that was around a bit, I bookmark it.
I use local tags to mark revisions. Perhaps I wanted to return to one day. They make it easy to find interesting past conditions.
I myself almost never make non-local tags or named branches (except by accident, and I destroy them if I do this). But our people release. Our released major versions have their own branches with names, and minor versions have tags on these branches. This ensures that these important branches and tags look the same for everyone.
Again, I have no idea if it is supposed to use mercurial, but it seems to be a model that works well for our team size.
If three or four of us wanted to collaborate in an experiment, it would probably be worth the named branch, which we would probably share among ourselves, but not put pressure on the central repo. I don’t know how well this will work!