goland 不原生支持 mercurial 分支模型,仅将 mercurial 视为提交/推送/拉取工具;它不识别或管理 bookmark 和命名分支,ui 中无分支列表、无法切换或合并,所有分支操作须在终端手动完成。

GoLand 本身不原生支持 Mercurial 的分支模型(如 hg bookmark 或 hg branch 的语义),它只把 Mercurial 当作“提交/推送/拉取”工具用,分支操作必须在终端里手动完成。
为什么 GoLand 的 Mercurial 支持看起来“没分支”
GoLand 的 VCS 面板里看不到 hg bookmark 列表,也选不了当前活跃的 bookmark —— 因为它压根没实现这个逻辑。它只识别工作目录当前所处的变更集(hg parents 输出),并把它当作“当前分支”显示(实际只是 tip commit 的哈希前缀)。这意味着:
- 你在 GoLand 里点 “New Branch”,它会调用
hg update -C+hg commit,但不会创建 bookmark,也不会切换到新命名分支 - 如果你用
hg bookmark feature/login创建了轻量级分支,GoLand 不会在 UI 里显示或允许你切换 - 合并操作(
hg merge)必须手敲命令,GoLand 的 Merge 对话框只对 Git 生效
如何在 GoLand 中安全配合 Mercurial 轻量分支(bookmark) workflow
你得把 GoLand 当成“代码编辑器 + 提交辅助”,把分支生命周期管理交给终端。关键动作要同步、不冲突:
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
- 每次在终端执行
hg update feature/login后,立刻在 GoLand 中按Ctrl+Shift+O(Mac 是Cmd+Shift+O)刷新项目,否则编辑器仍缓存旧变更集的文件状态 - 提交前,先在终端运行
hg status确认当前是目标 bookmark;GoLand 的 Commit 窗口里看不到 bookmark 名,别单凭文件列表判断“我在哪个分支” - 避免在 GoLand 里点 “Shelve Changes”,Mercurial 没有 shelve 概念,这功能在 Mercurial 项目中实际被禁用,点了也没反应
- 如果用了
hg branch(命名分支,非 bookmark),注意 GoLand 不会阻止你往 default 分支提交,容易误合入 —— 建议团队统一用 bookmark,禁用hg branch
配置 Mercurial 路径和用户信息(必须做,否则提交失败)
GoLand 不会读取系统级 .hgrc 的 [ui] username,它用自己的配置项。漏配会导致 abort: no username supplied (see "hg help config") 错误:
- 打开
Settings / Preferences → Version Control → Mercurial - 确保
Path to hg executable指向真实路径,比如/usr/local/bin/hg(macOS)或/usr/bin/hg(Ubuntu);不要填hg(依赖 PATH 可能失效) - 勾选
Use global Mercurial configuration file—— 这能让 GoLand 读取你的~/.hgrc,但仅限于网络代理、扩展启用等全局设置;username仍需单独填 - 在
User name栏手动输入完整格式:Your Name <you></you>(必须含尖括号,否则提交被拒绝)
轻量分支开发时最容易忽略的同步点
Mercurial 的 bookmark 是“移动指针”,不是 Git 的 ref;它不随 hg push 自动上传,必须显式加 -B:
- 你在本地建了
hg bookmark feat/api-v2,然后hg commit若干次 —— 此时远程仓库里根本没有这个 bookmark - 推送到远端需:
hg push -B feat/api-v2;只写hg push不会传 bookmark - 同事想基于它开发,得先
hg pull,再hg update feat/api-v2;如果他没看到这个 bookmark,说明你漏了-B - GoLand 的 Push 对话框里没有 “Push bookmarks” 复选框 —— 它根本不知道这回事,必须切终端
真正麻烦的不是操作多,而是所有这些 bookmark 生命周期动作都游离在 IDE 之外。一旦忘了某步(比如没 -B 推送),协作就断在看不见的地方。










