合并来自不同存储库的 Mercurial 分支

Posted

技术标签:

【中文标题】合并来自不同存储库的 Mercurial 分支【英文标题】:Merging Mercurial branches from separate repositories 【发布时间】:2011-07-08 09:39:45 【问题描述】:

我正在尝试弄清楚如何将分支从单独的 repo 合并到当前。

我有以下几点:

PJT1 - 包含分支 default 和 foodog

PJT2 - 包含默认分支

从 PJT2,我执行以下操作:

$ hg fetch -y ../PJT1 -r foodog -m "this is a test"

现在,如果我查看 PJT2,我会看到正确的文件和更改。但是,如果我这样做hg branches,我会得到以下信息:

[someone@myhome pjt2]$ hg branches
foodog                         1:c1e14fde816b
default                        0:7b1adb938f71 (inactive)

hg branch 揭示了以下内容:

[someone@myhome pjt2]$ hg branch
foodog

如何从 PJT1 的 foodog 分支中获取内容到 PJT2 的 default 分支中?

【问题讨论】:

【参考方案1】:

您需要合并,但请记住分支 foodog 上的更改将始终在 foodog 上 - 分支永远不会消失,但它们可以被隐藏。这一系列命令与您所要求的非常接近:

cd PJT2
hg update default # just in case you were somewhere else
hg pull ../PJT1 -r foodog  # that gets you foodog
hg merge foodog  # that merges the changes into default
hg commit # commit the merge
hg update foodog # go to the most recent change in foodog (note: it is not a 'head')
hg commit --close-branch

合并后hg branches 仍将显示foodog,除非您执行hg branches --active,它只显示有头的分支。在commit --close-branch 之后,你不会看到foodog,除非你看到hg branches --closed

这是因为 Mercurial 中的分支永远不会完全消失(一个设计特性),它们通常只保留用于像 release-1.0stable 这样的终身事物。对于像错误和功能这样的短期工作,请考虑使用书签。这是两者的一个很好的比较:http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial

【讨论】:

【参考方案2】:

您也可以尝试使用rebase 扩展名。它看起来像这样:

hg fetch -y ../PJT1 -r foodog -m "this is a test"
hg rebase --source <sRev> --dest <dRev>

rebase 操作将分离变更集 sRev 和所有后代,并将更改组应用到变更集 dRev。默认情况下,更改将应用​​于默认分支。因此,在您的情况下,sRev 将是分支 foodog 上的第一个变更集,而 dRev 将是 default 变更集你想应用它们。

最后,如果你想覆盖它并保留源分支名称,你可以使用 rebase 选项--keepbranches。您的问题表明这正是您不想做的,但仍应注意。

【讨论】:

以上是关于合并来自不同存储库的 Mercurial 分支的主要内容,如果未能解决你的问题,请参考以下文章

Git 与 Mercurial 存储库的互操作性

如何在 Mercurial 中克隆存储库的子文件夹?

Mercurial质疑如何处理不同的头脑

在 Mercurial 上退出向后合并

在推送之前丢弃 Mercurial 中的本地分支

如何在 Mercurial 中重复合并分支