Mercurial:在一个仓库中合并分支之间的一个文件

时间:2009-07-03 11:09:22

标签: version-control mercurial dvcs branching-and-merging

当我在Hg repo中有两个分支时,如何只将一个文件与另一个分支合并,而没有将变更集中的所有其他文件合并?

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

4 个答案:

答案 0 :(得分:55)

警告:@Martin_Geisler推荐的这种“虚拟合并”可能会让你感到困惑,如果以后你想要对这两个分支进行真正的合并。将记录虚拟合并,并说您合并到您进行虚拟合并的分支 - 您将看不到更改。或者,如果您合并到另一个分支,则其他分支上的更改将被撤消。

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

   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创建两个分支的合并,可能/可能在另一个分支上,检查,然后复制合并和转移分支之间的单个文件:

   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 revert”。即。

   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”......对某些使用模式有意义,但不是全部。

答案 1 :(得分:18)

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

但您可以执行“dummy merge”,忽略其中一个分支的传入更改。在提交之前,您可以将所选文件还原为您想要的任何状态:

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

也许这会对你有所帮助。

答案 2 :(得分:1)

我只想使用像vimdiff这样的外部工具来区分我要合并的两个文件然后合并它们。这样做的好处是您可以对文件的某些部分进行选择性编辑。 E.g:

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

要执行此操作,您需要在.hgrc中启用外部工具,这只是意味着添加以下行:

[extensions]
hgext.extdiff =  

答案 3 :(得分:0)

获得所需结果的一种相当干净的方法是分两步完成:首先使用 graft,然后第二次使用 histedit

说这是起点,您需要在C之后选择DE的某些部分进行“合并”:

A---B---C---D
      \
       -E

然后您将在 C 之上嫁接 DE

A---B---C---D
      \
       -E--C'--D'

然后使用 hg histedit编辑 C'D'。在编辑过程中,您可以进行任何您想要的更改,但在这种情况下,您只需还原任何不需要的文件(甚至是其中的一部分)。

(请注意,histedit edit 通过临时更新您的工作文件夹以匹配给定变更集的内容,就好像它尚未提交一样。因此您可以轻松恢复不需要的文件,然后 hg histedit --continue将有效替换编辑的变更集。)

所以最后的结果是:

A---B---C---D
      \
       -E--C''--D''

根据需要修改了 '' 修订版。

我会说,当您有大量的变更集时,这种方法更有益,而这些变更集最初可能应该是多个较小的提交;这种方法允许您仅“解开”您需要的部分。仅将其用于单个文件会很好,但可能会过大。