如何让Mercurial执行hg pull -u无冲突时自动提交?
刚从Git转回Mercurial确实会遇到一些习惯上的差异,我来帮你搞定这两个问题:
一、让hg pull -u无冲突时自动提交合并
Mercurial默认不会自动提交合并结果,但有两个实用方案可以实现需求:
1. 使用内置的fetch命令
Mercurial自带的fetch扩展(默认启用)就是为了简化拉取+合并+提交的流程——它会自动完成pull→update→merge(如果需要)→自动提交无冲突合并的全流程。你只需要把hg pull -u换成:
hg fetch
如果你的环境里fetch没启用,在.hgrc里添加配置即可:
[extensions] fetch =
默认的合并提交信息是Mercurial自动生成的,你也可以通过配置自定义这个信息。
2. 自定义命令别名
如果你更习惯pull -u的命名逻辑,可以在.hgrc里定义一个别名,把自动提交的逻辑整合进去:
[alias] pullauto = !hg pull -u && if hg merge --preview | grep -q "no merge needed"; then exit 0; else hg merge && hg commit -m "Auto-merged remote changes"; fi
之后用hg pullauto代替pull -u就行,这个脚本会先执行拉取更新,检查是否需要合并,无冲突时自动提交合并结果(Windows用户需要把grep换成findstr调整脚本)。
二、消除日志里的"Merge..."提交,同时保留合并历史
如果想彻底去掉单独的Merge提交节点,同时保留所有变更的历史,**变基(rebase)**是最佳选择——它会把你的本地提交"移动"到远程分支的最新版本之后,形成线性的提交历史,完全不会产生Merge提交。
具体操作是用pull --rebase代替pull -u:
hg pull --rebase && hg update
这个命令会先拉取远程变更,自动把本地提交变基到远程分支顶端,无冲突时不需要手动操作,最终的日志里只会看到线性的提交记录,没有Merge节点。
你也可以把这个组合命令做成别名,方便日常使用:
[alias] pullrebase = hg pull --rebase && hg update
⚠️ 注意:变基会修改本地提交的历史,所以如果你的本地提交已经推送到共享仓库,不要使用这个方式——这会导致团队其他成员的历史不一致。但如果是个人仓库或者团队约定允许变基,就完全没问题。
如果你还是想保留分支合并的拓扑结构(比如需要记录分支合并的事实),只是不想看到默认的"Merge..."提交信息,可以通过配置修改合并时的默认提交信息,或者用钩子自动替换,但这种方式还是会存在Merge提交节点,只是信息不同,不如变基来得彻底。
内容的提问来源于stack exchange,提问作者Sébastien Pierre

