Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

...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.

like image 616
Jason S Avatar asked Jan 15 '09 21:01

Jason S


2 Answers

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.

like image 194
Draemon Avatar answered Sep 28 '22 03:09

Draemon


For question 1, you need to be a little clearer about what you mean by "changes". Which of these do you mean:

  1. "I want to pull some, but not all, of the changesets in a different branch into this one."
  2. "I want to pull the latest version of some, but not all, of the files in a different branch into this one."

If you mean item 1, you should look into the Transplant extension, specifically the idea of cherrypicking a couple of changesets.

If you mean item 2, you would do the following:

  • Update to the branch you want to pull the changes into.
  • Use hg revert -r <branch you want to merge> --include <files to update> to change the contents of those files to the way they are on the other branch.
  • Use hg commit to commit those changes to the branch as a new changeset.

As for question 2, I never use repository clones for branching myself, so I don't know. I use named branches or anonymous branches (sometimes with bookmarks).

like image 38
Steve Losh Avatar answered Sep 28 '22 03:09

Steve Losh