Mercurial: Switch working directory to branch without losing changes

branchmercurial

Let's say that I have a named branch 'B1' which I'm doing feature development on.
I am at a good stopping point before a demo though not done with the feature so I:

hg up default
hg merge B1
hg ci -m "merged in feature drop"
hg push

Now I continue working for a half an hour or so and go to commit only to realize that I forgot to update back to B1 and that my current working directory is on default – uhoh. In theory I should be able to just mark my working directory parent as the tip of B1 – is there an easy way to do this?

I could of course commit, update back to B1, and merge my changes back, but then there's an unstable changeset in default and this happens often enough to me that I would like a real solution.

Best Answer

Two ways. First, the obvious way:

hg diff > foo
hg up -C b1
hg import --no-commit foo
rm foo

Second, the magical way:

hg up -r 'ancestor(., b1)'  # take working dir back to the fork point
hg up b1                    # take it forward to the branch head

This way involves merges. Depending on how much your branches have diverged, this may be painless. Or it may be complicated, and you may make a mess of your changes that you haven't saved anywhere. Which is why even magicians like myself prefer to do it the first way.