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 " ...对于某些使用模式有意义,但并非全部。
-
这应该是公认的答案,而不是马丁·盖斯勒(Martin Geisler)给出的答案。尽管实际上并不会合并文件,但是大多数情况下,复制它是一个人想要做的事情,并且不会弄乱分支。
-
这对于将单个文件从分支引入主干非常有用。但是,我注意到的一件事是,到中继的签入似乎没有显示在文件的历史记录中,这是不幸的。
-
您好,谢谢您的回答。但是我遇到了麻烦,在我的情况下,我的源分支包含一个默认分支中不存在的文件,但是我想将其复制回去而不合并该分支的其余部分。当我尝试执行您所描述的操作时,我得到" rev中没有这样的文件"有什么建议吗?
-
因此,解决我的问题的方法是手动复制文件,然后运行复制命令,但是我想知道是否存在针对目标分支中不存在的新文件的解决方案?
-
@propagated:分支#1和#2。在branch#2中,您创建了文件Foo。将Foo传播到分支#1。如果添加文件Foo是唯一的更改,则进行合并。但是,如果Branch#2上还有其他事情您现在不想合并,并且您不想让整个回购合并记错-例如,如果您只想从Branch#复制一个文件(或多个文件),则不会。 2到Branch#1,然后执行:hg update -r Branch#1; hg revert -r Branch#2 Foo; hg ci。最大的麻烦是文件名补全不起作用,因为文件Foo在Branch#1中尚不存在。
-
@Brad_Oestreicher:是的,很遗憾,除了您提供的任何评论之外,Mercurial历史上没有任何迹象表明发生了什么。例如。我依靠" hg glog"获得漂亮的树形图。如果可以在复制文件之间的修订版之间划一条线,那么Ot会很好。 IE。跟踪部分合并以及完全合并会很好。太多的DVCS具有"仅整个存储库"的观点。
-
@KrazyGlew哪个DVCS没有?
-
有一种方法可以一次性重命名复制的文件吗?对于hg revert,我认为只能在hg commit之后进行hg mv -ed(用于还原)。因此,这是两次提交。
-
@ n611x007问:是否可以一次性重命名复制的文件?答:我不知道-我现在不在使用Mercurial。但是,即使不是:为什么要在意呢?启动一个(子)分支,复制文件,重命名,然后合并回到父分支=>仅在父分支上迈出了一步,尽管实际上不止一个。不太好,但是一般的方法。
-
@ n611x007问:哪个DVCS没有[具有完整的回购观点]? A1:我知道目前没有不是完整回购的DVCS(各种进口商品除外)。解答2:CVS不是DVCS,但支持部分签出和签入。 A3:我的cvs-file-merge使CVS成为DVCS-但是当Linus宣布git时,我停止了这项工作。 A4:Linus告诉我git的底层结构可以支持部分co / ci和其他subrepo东西,但是对某些瓷器来说将是一个很大的变化。
-
结果是否将文件再次添加到存储库?那么,这样操作后会占用两倍的空间吗?还是Hg设法查看该文件已在存储库中?
不。 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.' |
也许会对您有所帮助。
- 警告:如果以后要对两个分支进行真正的合并,那么这种"虚拟合并"可能会使您陷入困境。虚拟合并将被记录,并说您合并到将虚拟合并合并到的分支中-您将看不到更改。或者,如果您合并到另一个分支,则该另一个分支上的更改将被撤消。 //如果只想将整个文件从一个分支复制到另一个分支,则可以简单地" hg update -r to-branch; hg revert -r file" //如果要选择该文件的不同部分,则"汞记录"很有用。 //我只是在我的主目录.hgignore中执行了此操作。
-
一个肮脏的技巧是使用hg merge创建两个分支的合并,检入,然后使用" hg update -t?? to-branch; branch merge-branch;"在合并和to-branch之间复制单个文件。 hg merge -r from-branch; hg ci -m'将要合并的临时合并"; hg update -r to-branch; hg revert -r merge-branch单文件-u-want; hg ci -m'从分支到分支合并单个文件"; hg条合并-分支。
-
噢,哎呀,我不妨将我的评论变成一个真正的答案。
我只会使用像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 = |