Mercurial, “Branching with bookmarks”
I read this document: A Guide to Branching with Mercurial, specifically the section titled Branching with Bookmarks.
To switch to one of these branches you can use
hg update featureto update to the tip changeset of that branch and mark yourself as working on that branch. When you commit, it will move the bookmark to the newly created changeset.
I tried this, but it ended up moving both bookmarks at the same time.
Is that guide wrong, outdated, or did I do something wrong? Note that I know that having bookmarks on separate branches only moves the bookmark related to the branch I’m currently working on, but that guide (which a lot of people says is the definite guide to this) specifically says the above text, which indicates that it should’ve worked by “telling” Mercurial which bookmark (branch) I’m working on.
Testing shows otherwise though.
> hg init > echo 1 >test.txt > hg commit -m "initial" --addremove adding test.txt > hg bookmark main > hg bookmark feature > hg log changeset: 0:c56ceb49ee20 tag: feature tag: main tag: tip user: Lasse V. Karlsen <firstname.lastname@example.org> date: Tue Nov 30 23:06:16 2010 +0100 summary: initial > hg update feature 0 files updated, 0 files merged, 0 files removed, 0 files unresolved > echo 2 >test2.txt > hg commit -m "feature 1" --addremove adding test2.txt > hg log changeset: 1:9f2f5869b57b tag: feature <---- both were moved tag: main <---- tag: tip user: Lasse V. Karlsen <email@example.com> date: Tue Nov 30 23:06:45 2010 +0100 summary: feature 1 changeset: 0:c56ceb49ee20 user: Lasse V. Karlsen <firstname.lastname@example.org> date: Tue Nov 30 23:06:16 2010 +0100 summary: initial
2 Solutions collect form web for “Mercurial, “Branching with bookmarks””
If I got you right, you want only the bookmark you’ve updated to move on the next commit. For this purpose the bookmarks extensions has the
By default, when several bookmarks point to the same changeset, they will all move forward together. It is possible to obtain a more Git-like experience by adding the following configuration option to your .hgrc
[bookmarks] track.current = True
In your example, this would keep the main bookmark at revision 0.
track.current option is enabled, the currently active bookmark is annotated with an asterisk in the output of
UPDATE: Since Mercurial 1.8 the default behavior is to only move the current bookmark, i.e. the above mentioned option is not needed anymore .
If you read the description of the BookmarksExtension, it says:
Bookmarks are references to commits that are automatically updated when new commits are made.
Since bookmarks are automatically updated when commiting to the changeset they are pointing to, they are especially useful to keep track of different heads.
In your case, you only had one head in the repository at the time you created both bookmarks. If you use a sequence like the following, it should work as you expect:
hg init foo # edit, edit, edit hg commit -A -m "root" hg bookmark main # edit, edit, edit ... hg commit -m "main 1" hg update 0 # edit, edit edit hg bookmark feature hg commit -m "feature 1"