Mercurial: Switch working directory to branch without losing changes?

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?

  • Showing git branch in shell prompt?
  • How can I make Jenkins only build feature branches if they have changed when triggering from bitbucket
  • Rebasing a branch including all its children
  • Why does Git not store the branch name as part of the commit?
  • How to update my working Git branch from another branch (develop) ?
  • bitbucket branch or repository or folders?
  • 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.

  • How can I explain source control (Mercurial/Tortoise specifically) to a non-programmer?
  • git rebase --onto results on single commit
  • Mercurial log interface
  • Can I use git-svn to clone a specific branch of a remote SVN repo and commit back to it?
  • How can I export a large Perforce repository into a different version control system without losing the history?
  • Git: Renaming a directory in a branch
  • 4 Solutions collect form web for “Mercurial: Switch working directory to branch without losing changes?”

    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.

    I would use the shelve extension. I think it’s distributed along with TortoiseHg, you can also use it from the UI:

    hg shelve --all
    hg up B1
    hg unshelve
    

    Typically for this sort of dynamic approach, I favor mercurial queues.

    In your situation, what I would do would be to create a patch on default with the changes, pop the patch off, switch over to B1, and apply the patch.

    It goes something like:

    hg qnew OOPSPATCH
    hg qrefresh 
    hg qpop 
    hg up B1 
    hg qpush
    
    <hack hack>
    
    hg qrefresh 
    hg qfinish
    

    Rebase extension allow you to change parent for any commit for wrongly commited changeset.

    If you want just change branch for future commit – MQ (as mentioned) or Shelve

    Git Baby is a git and github fan, let's start git clone.