best practices in mercurial: branch vs. clone, and partial merges?

Jason S picture Jason S · Jan 15, 2009 · Viewed 26.4k times · Source

...so I've gotten used to the simple stuff with Mercurial (add, commit, diff) and found out about the .hgignore file (yay!) and have gotten the hang of creating and switching between branches (branch, update -C).

I have two major questions though:

  1. If I'm in branch "Branch1" and I want to pull in some but not all of the changes from branch "Branch2", how would I do that? Particularly if all the changes are in one subdirectory. (I guess I could just clone the whole repository, then use a directory-merge tool like Beyond Compare to pick&choose my edits. Seems like there ought to be a way to just isolate the changes in one file or one directory, though.)

  2. Switching between branches with update -C seems so easy, I'm wondering why I would bother using clone. I can only think of a few reasons (see below) -- are there some other reasons I'm missing?

    a. if I need to act on two versions/branches at once (e.g. do a performance-metric diff)

    b. for a backup (clone the repository to a network drive in a physically different location)

    c. to do the pick&choose merge like I've mentioned above.

Answer

Draemon picture Draemon · Jan 16, 2009

I use clone for:

  • Short-lived local branches
  • Cloning to different development machines and servers

The former use is pretty rare for me - mainly when I'm trying an idea I might want to totally abandon. If I want to merge, I'll want to merge ALL the changes. This sort of branching is mainly for tracking different developers' branches so they don't disturb each other. Just to clarify this last point:

  • I keep working on my changes and pull my fellow devs changes and they pull mine.
  • When it's convenient for me I'll merge ALL of the changes from one (or all) of these branches into mine.

For feature branches, or longer lived branches, I use named branches which are more comfortably shared between repositories without merging. It also "feels" better when you want to selectively merge.

Basically I look at it this way:

  • Named branches are for developing different branches or versions of the app
  • Clones are for managing different contributions to the same version of the app.

That's my take, though really it's a matter of policy.