开发者

Mercurial: how to merge changes to a file that's renamed in the other branch?

开发者 https://www.devze.com 2023-01-22 07:10 出处:网络
I have a Mercurial repository with four branches in it. One is the "common" branch, the other three are "specific" branches which consist of some cosmetic changes applied to the co

I have a Mercurial repository with four branches in it. One is the "common" branch, the other three are "specific" branches which consist of some cosmetic changes applied to the common branch. One of those cosmetic changes consisted of renaming some files.

So the common branch has "file.txt", and the first specific branch has "file-01.txt" which is the same file, used for the same purpose but has a different name and slightly different contents. It was renamed to file-01.txt on the specific branch, and "hg log -f file-01.txt" correctly shows the history going back to before the rename.

When I make a change to file.txt on the common branch, I need to be able to merge that change into file-01.txt on the specific branch. But Mercurial doesn't understand that the files are the same. It tells me:

remote changed file.txt which local deleted

use (c)hanged version or leave (d)eleted?

If I pick "c" then I get a new file.txt containing exactly what's in the common branch's version. If I pick "d" then the change isn't merged at all.

What can I do to get this right?


EDIT: I can make it work correctly in a fresh test repository, but not my actual repo. Here's what I get (note that rev 118 is on the specific branch, just before the original rename, so I'm going through the rename process again to illustrate):

C:\...> hg update -C 118

0 files updated, 0 files merged, 0 files removed, 0 files unresolved

C:\...> hg merge default

开发者_如何学编程

merging file.txt

merging anotherfile.txt

0 files updated, 2 files merged, 0 files removed, 0 files unresolved

(branch merge, don't forget to commit)

So it works without the rename. But if I rename, it fails:

C:\...> hg update -C 118

2 files updated, 0 files merged, 0 files removed, 0 files resolved

C:\...> hg rename file.txt file-01.txt

C:\...> hg commit -m "renamed"

created new head

C:\...> hg merge default

remote changed file.txt which local deleted

use (c)hanged version or leave (d)eleted?


EDIT 2: Here's what I get at that last step from hg merge --debug default:

searching for copies back to rev 115

unmatched files in local:

file-01.txt

all copies found (* = to merge, ! = divergent):

file-01.txt -> file.txt

checking for directory renames

resolving manifests

overwrite None partial False

ancestor 9d979018c2df local f842fdbc252b+ remote 05fc75e480da

anotherfile.txt: versions differ -> m

remote changed file.txt which local deleted

use (c)hanged version or leave (d)eleted?


I ended up tracking the problem down to one particular revision in the history: I could merge across the rename as long as that revision wasn't involved. Still not sure what went wrong with that revision, but I redid the changes and it's working now.


The problem is with how you handled the rename in the branch. From the looks of it you (or your GUI) did a 'remove' on the old name, file.txt, and then did an add of a copy of that file named file-01.txt.

When you do it that way, mercurial has no idea they're linked. If, however, you had, in the branch, used the command:

hg rename file.txt file-01.txt

then rather than the message you're seeing the changes from file.txt would be applied to file-01.txt. However, without your help mercurial can't know they're linked.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号