Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mercurial: Merging one file between branches in one repo

When I have two branches in Hg repo, how to merge only one file with another branch, without having all other files from changeset merged?

Is it possible to merge only certain files, instead of whole changeset?

like image 618
Jox Avatar asked Jul 03 '09 11:07

Jox


People also ask

How do I merge branches in Mercurial branch?

To merge two branches, you pull their heads into the same repository, update to one of them and merge the other, and then commit the result once you're happy with the merge.

How do you combine two mercurial heads?

To start a merge between the two heads, we use the hg merge command. We resolve the contents of hello. c This updates the working directory so that it contains changes from both heads, which is reflected in both the output of hg parents and the contents of hello.

What does HG update do?

Use the command hg update to switch to an existing branch. Use hg commit --close-branch to mark this branch head as closed.


1 Answers

WARNING: such a "dummy merge", as is recommended by @Martin_Geisler, can really mess you up, if later you want to do a true merge of the two branches. The dummy merge will be recorded, and say that you merge into the branch you did the dummy merge to -- you will not see the changes. Or if you merge into the other branch, the changes on that other branch will be undone.

If all you want is to copy an entire file from one branch to another, you can simply do:

   hg update -r to-branch    hg revert -r from-branch file    hg ci -m 'copied single file from from-branch to to-branch 

If you want to select different parts of that file, then "hg record" is useful.

I just did this on my home directory .hgignore.

If both branches have made changes to a file that you want to keep, a dirty trick would be to create a merge of the two branches using hg merge, possibly/probably on still another branch, check that in, and then copy a single file between the merge and the to-branch:

   hg update -r to-branch    branch merge-branch    hg merge -r from-branch    hg ci -m 'temp merge to be discarded"    hg update -r to-branch    hg revert -r merge-branch single-file    hg ci -m 'merged single-file from from-branch to to-branch"    hg strip merge-branch 

It is worth mentioning: the way to "copy a single file between branches" (or revisions, or from revision to merge, or....) is "hg revert". I.e.

   hg update -r Where-you-want-to-copy-to    hg revert -r Where-you-want-to-copy-from file-you-want-to-copy    ...    hg ci 

For some reason I, and some of my coworkers, find this VERY confusing. "revert"=="copy" ... makes sense for some usage patterns, but not all.

like image 81
Krazy Glew Avatar answered Sep 20 '22 01:09

Krazy Glew