Skip to content

Issue 128

clean edited this page Sep 29, 2026 · 1 revision

Issue #128:远程分支切换为本地跟踪分支

背景与根因

v0.5.1 的分支选择器把完整远程引用传到服务端,服务端执行 git switch --detach。选择 remotes/origin/feature/demo 后进入游离 HEAD,没有本地分支或 upstream。

PR #129 已实现创建/复用本地跟踪分支及共用冲突交互。本次补充处理其余边界:名称为 remotes/origin/feature/demo 的本地分支和真正的远程引用不能靠名称前缀区分;分支列表需返回准确类型与 upstream,才能保留用户选择的分组。

目标与范围

工具条和分支面板选择远程分支时,复用对应本地跟踪分支,或者创建并切换到本地分支。同名冲突由用户选择现有分支、换名创建或取消。保留工作区内容和已有上游,不强制切换。

沿用手动“获取”;本次不增加自动 fetch,也不增加显式游离 HEAD 检出入口。没有数据库迁移。

方案与取舍

  1. 分支列表使用 for-each-ref 的完整 ref、HEAD、upstream 和 symref 信息,区分 refs/heads/ 与 refs/remotes/,跳过符号引用。面板可显示真实 upstream。
  2. 切换 HTTP 请求保留 name、localName,增加可选 isRemote。两个 UI 入口明确传递类型;旧调用未传类型时仍优先识别已存在的字面本地分支。
  3. 服务端按完整 upstream 匹配本地跟踪分支;有多个匹配时优先当前分支。远程名称从配置读取并按最长前缀匹配,支持包含斜杠的 remote。
  4. 本地切换使用 git switch --no-guess -- <name>,失效本地选择不会触发其他 remote 的自动推断。远程创建使用 git switch --track -c <local> -- <full-ref>,避免依赖较新的 --track=direct 写法。
  5. 拒绝失效 ref、远程 HEAD 符号引用和无效新分支名。存在同名且未跟踪所选远程的本地分支时,保留 LOCAL_BRANCH_EXISTS 冲突码;不重写分支或上游。
  6. 沿用 #129 的共用交互和刷新行为,保留 branch / stdout 响应。选择现有分支时显式传递本地类型;换名创建继续保留原 remote。

验收标准

  • 两个入口为仅远程存在的分支创建本地跟踪分支,HEAD 不游离。
  • 复用已有跟踪分支,重复选择不会重复创建。
  • 同名冲突提供三种选择,保持原分支和跟踪关系。
  • 多 remote 同名及包含斜杠的 remote 按实际选择处理。
  • origin/literal、remotes/origin/... 本地字面名称与远程引用分别处理。
  • 工作区覆盖冲突、失效引用及执行失败保留文件、索引和原分支。
  • 临时本地仓库和真实回环 SSH 通道回归通过。
  • 保留 #129 对 local-git.spec.ts 游离断言的修正,并补充回归测试。

验证记录

见 Issue-128-Validation,包含命令、环境、前后截图、回环 SSH 范围及未验证项。

风险与回退

实际测试 Git 为 2.43.1,旧 Git 尚未安装验证。Windows / Linux 的桌面界面、外部 SSH 主机和非回环网络未手工验证;自动测试和本地回环结果不能替代这些环境。保留 Git 对已修改文件和其他 worktree 占用分支的保护。

可通过回退本次代码提交恢复 #129 的实现;Wiki 独立维护,回退时另行标注历史。

Clone this wiki locally