关于版本控制:Mercurial:在一个仓库中合并分支之间的一个文件

Mercurial: Merging one file between branches in one repo

当我在汞仓库中有两个分支时,如何只将一个文件与另一个分支合并,而又不将变更集中的所有其他文件合并?

是否可以仅合并某些文件,而不合并整个变更集?


警告:@Martin_Geisler建议使用的这种"虚拟合并"确实会使您搞砸,如果以后您想对两个分支进行真正的合并。虚拟合并将被记录,并说您合并到将虚拟合并合并到的分支中-您将看不到更改。或者,如果您合并到另一个分支,则该另一个分支上的更改将被撤消。

如果您只想将整个文件从一个分支复制到另一个分支,则只需执行以下操作:

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

如果要选择文件的不同部分,则"hg record"很有用。

我只是在我的主目录.hgignore中做到了。

如果两个分支都对您要保留的文件进行了更改,一个肮脏的技巧是使用hg merge创建两个分支的合并,可能/可能在另一个分支上,将其签入,然后进行复制合并和分支之间的单个文件:

1
2
3
4
5
6
7
8
   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

值得一提的是:"在分支之间复制单个文件"(或修订,或从修订合并到,或...)的方法是" hg恢复"。即

1
2
3
4
   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

出于某种原因,我和我的一些同事发现这很令人困惑。 " revert " == " copy " ...对于某些使用模式有意义,但并非全部。


不。 Mercurial在变更集的基础上工作。

但是您可以执行"虚拟合并",而忽略其中一个分支的传入更改。提交之前,您可以将所选文件还原为所需的任何状态:

1
2
3
% HGMERGE=internal:local hg merge     # keep my files
% hg revert --rev other-branch a.txt  # update a.txt to other branch
% hg commit -m 'Dummy merge to pick a.txt from other-branch.'

也许会对您有所帮助。


我只会使用像vimdiff这样的外部工具来比较要合并的两个文件,然后将它们合并。这样做的好处是您可以对文件的某些部分进行选择性编辑。例如:

1
2
hg update -r branch-merging-to
hg extdiff -p vimdiff -r branch-merging-from file-I-am-merging

为此,您需要在.hgrc中启用外部工具,这仅意味着添加以下行:

1
2
[extensions]
hgext.extdiff =