Mercurial仓库合并变更集的推荐方法及分支场景处理
Mercurial 合并关联变更集并同步克隆仓库的解决方案
咱们先从简单的基础场景说起,再一步步拆解带分支的复杂情况,确保Main仓库和Max的本地仓库都能得到期望的历史结构。
基础场景:合并连续无分支的关联变更集
核心思路是先改写Main仓库的历史,再让Max把本地提交同步到新的历史上,注意:改写公共仓库历史前,一定要通知所有克隆用户(比如Max),避免历史混乱!
步骤1:修改Main仓库的历史
- 确保Main仓库处于干净状态,切换到最新节点E:
hg update E - 使用
histedit工具编辑历史(Mercurial默认自带该工具),从要合并的第一个变更集开始(这里从B1启动,一次性处理B系列和D系列):hg histedit B1 - 在弹出的histedit编辑界面中,做如下调整:
- 找到B2对应的行,把操作从
pick改成fold(表示将B2合并到前一个变更集B1),之后可以修改合并后的提交信息为“变更集B”。 - 找到D2、D3对应的行,依次把操作改成
fold,合并到D1上,再把合并后的提交信息改为“变更集D”。
- 找到B2对应的行,把操作从
- 保存并退出编辑界面,Mercurial会自动执行合并操作,此时Main的历史就变成了
A--B--C--D--E。
步骤2:同步Max的本地仓库
- Max先备份自己的本地仓库(防止操作失误丢失提交f、g),然后切换到节点E:
hg update E - 拉取Main仓库改写后的历史:
hg pull Main - 此时会出现历史分叉,用
rebase把本地提交f、g迁移到新的E节点之后:
(你可以通过hg rebase --dest <新E节点的哈希值或标识>hg log查看Main拉取过来的新E节点标识) - 完成后,Max的本地历史就变成了
A--B--C--D--E--f--g。
复杂场景:待合并变更包含已合并分支
这里D系列存在分支(D2分出D3,之后D4合并了D2和D3),我们可以用collapse扩展更高效地合并多分支的变更集,步骤如下:
步骤1:修改Main仓库的历史
- 先启用
collapse扩展(默认未开启),编辑仓库的.hg/hgrc或全局~/.hgrc文件,添加:[extensions] collapse = - 切换到D4节点:
hg update D4 - 合并D1到D4的所有变更集为单个变更集D:
hg collapse -r D1:D4 --message "合并D1-D4为变更集D" - 把E节点迁移到新的D变更集之后:
此时Main的历史就变成了hg rebase -r E -d <新D节点的哈希值>A--B--C--D--E,和预期一致。
步骤2:同步Max的本地仓库
和基础场景完全一致:备份仓库→拉取Main的新历史→用rebase将f、g迁移到新的E节点之后即可。如果迁移过程中出现冲突,手动解决冲突后继续执行hg rebase --continue即可。
关键注意事项
- 历史改写风险:公共仓库改写历史后,所有克隆用户必须同步操作,否则会导致历史分叉和数据冲突。
- 备份优先:操作前一定要备份所有相关仓库,避免不可逆的数据丢失。
- 冲突处理:如果Max的f、g和改写后的历史有冲突,需要手动解决冲突后完成rebase。
内容的提问来源于stack exchange,提问作者Teck-freak
相关产品推荐
相关产品推荐

