在Mercurial中,如何从Changeset中提取单个文件的更改以应用于另一个分支?

时间:2010-11-30 10:22:44

标签: mercurial tortoisehg

我在一个分支上有很多文件的大量提交,我需要将该变量集中单个文件的修改转移到另一个分支。我怎样才能做到这一点?我主要使用TortoiseHg,但命令行解决方案也很好。

如果我转到TortoiseHg中的变更集并选择文件,我可以看到我要传输的差异,但不能实际应用它们。

2 个答案:

答案 0 :(得分:9)

您可以使用以下命令获取该文件的补丁:

hg log -r THEREVISIONWITHLOTSOFCHANGES -p -I path/to/justthatfile > justthatfile.patch

然后你可以在你想要的任何分支上导入:

hg update anotherbranch
hg import --no-commit justthatfile.patch
hg commit

答案 1 :(得分:2)

最基本的解决方案是转储文件的补丁,将其应用到当前工作版本并提交它(假设您位于存储库的根目录下):

$ hg up <revision-to-apply-the-patch-to>
$ hg diff -c <revision-containing-the-patch> <files-to-include> | patch -p0
$ hg ci -m "Transplanting selected changes from <revision-contain...>"

这种方法的缺点是,从修订历史角度来看,你所做的并不是很明显。一个好的提交消息在这里有帮助,但历史图表没有提示移植某些更改的过程。在这种情况下,合并和还原可能是一个更好的解决方案:

$ hg up <revision-to-apply-the-patch-to>
$ hg merge -r <revision-containing-the-patch>
$ hg revert --no-backup <files-to-exclude>
$ hg ci -m "Merge in changes of <files-to-include>"

可能还有更多的解决方案可以做到这一点 - 我首先想到了这两个。