Skip to content

11 · Git 集成与并行任务 ​

这一篇面向开发者

如果你不写代码、工作空间里没有 Git 仓库,这一章可以跳过——界面上相关入口会保持置灰。

当工作空间内包含 Git 仓库时,原本需要切到终端或 IDE 才能完成的 Git 操作,可以直接在 WorkBuddy 内完成。两项能力:

  • 分支从隐式变显式——创建任务时即可查看当前检出的分支,并安全切换
  • 多任务并行且互不干扰——让多个任务在相互隔离的工作目录中并行运行,文件系统层面完全隔离

两项能力都建立在 Git 原生语义之上——不引入额外概念,熟悉 Git 的人可以直接推断系统的真实行为。

一、分支显示与切换 ​

创建任务时选分支 ​

工作空间内包含 Git 仓库时,新建任务页面会显示当前分支并支持直接切换:

  • 显示当前分支——默认展示当前检出的本地分支名
  • 切换分支——点分支选择器,可切换至其他本地分支或远程分支,支持搜索
  • 切换确认——切换分支后点发送初始任务指令时会弹出确认对话框;未切换分支则不需要确认,直接开始

分支选择器的状态:

工作空间类型分支选择器
普通文件夹(非 Git 仓库)不可操作(置灰)
正常 Git 仓库可操作

有未提交改动时怎么办 ​

切换分支时,如果当前工作区存在未提交的改动,确认弹窗提供三种处理方式:

处理方式说明
Commit 到当前分支(默认)弹出轻量提交面板,勾选变更文件并填写提交信息,提交完成后再切换
Stash 变更自动把当前改动(含未跟踪文件)暂存起来,再切换
丢弃变更放弃所有未提交的改动后切换,需二次确认

默认选中 Commit 是有道理的

Commit 是三者里最安全的:改动进了历史,随时能找回来。

Stash 也能找回,但 stash 栈很容易被人忘掉——尤其是当 stash 是工具替你做的、而不是你自己敲的时候。

丢弃是真的没了。它需要二次确认,请把那次确认当回事。

两条保障机制:

  • 若切换失败,工作区会完整回滚到操作前的状态,不会残留中间态
  • 选择远程分支时,系统会自动创建同名本地分支并跟踪该远程分支,再切换过去;若本地已存在同名分支,会提示你手动命名

执行中的分支显示 ​

在已有任务的对话界面中,工作区状态栏会实时显示当前检出的分支名,分支发生变化后自动刷新。

这个显示比看起来重要:多任务并行的时候,「我现在这个 Agent 到底在哪个分支上改东西」是最容易搞混的事。

二、Worktree 并行任务 ​

它是什么 ​

Worktree Task 利用 Git worktree 的原生能力,为每个并行任务提供完全隔离的工作目录,同时与主仓库共享分支和 Git 对象。

适用场景:你需要同时推进多个独立任务(新特性开发、bug 修复、实验性方案),又不希望它们与你当前的工作目录互相干扰。

不开 Worktree 的话,两个 Agent 在同一个目录里改文件,结果是互相覆盖、diff 混成一团。

创建 ​

  1. 在新建任务页面输入任务指令
  2. 工作空间包含 .git 目录时,输入框下方会展示 Worktree 开关(默认关闭)
  3. 开启后展开 Base Branch(基础分支) 选择器,默认选中本地主分支(如 main),可切换为其他本地或远程分支,支持搜索与 fetch 刷新
  4. 发送任务指令,系统开始创建,界面实时展示创建进度(大型项目可能需要数十秒到一分钟)
  5. 创建完成后,Agent 自动启动并执行任务指令

创建时系统自动完成三件事:

  • 在 ~/WorkBuddy/Worktrees 目录下创建独立的 worktree 工作目录
  • 基于所选 Base Branch 的 HEAD commit 新建任务分支,命名格式为 workbuddy/{基础分支}-{8位随机哈希}(如 workbuddy/main-a3f8c2b1)。前缀 workbuddy/ 用于与你手动创建的分支区分
  • 创建失败时自动回滚已创建的 worktree 与分支,不遗留半成品资源

三条约束

  • 非 Git 项目(无 .git 目录)不展示 Worktree 开关,只能创建普通任务
  • Base Branch 在任务创建后锁定,不可修改;任务分支在生命周期内也不提供切换入口
  • 创建任务时源工作区存在未提交改动不影响创建,新任务基于所选 Base Branch 的 HEAD commit 开始,不包含未提交改动

第三条容易踩:你手上改了一半的代码,不会跟着进 worktree。想带过去,先 commit 或者 stash 后 apply。

任务标识 ​

Worktree Task 在任务列表和详情页中有明确标识:

  • 类型标识——任务列表标题前展示独特的 fork 类型图标,与普通任务明确区分;任务在列表中仍按原项目分组
  • 分支标识——任务卡片与任务标题旁展示当前分支 Badge(如 workbuddy/main-a3f8c2b1),只读展示,hover 查看详情,点击可复制分支名

自动清理 ​

为避免 Worktree Task 持续累积占用磁盘空间,系统有清理策略(仅针对 Worktree Task,创建普通任务不受任何限制):

数量行为
达到 25 个在首页创建新 Worktree Task 时展示数量较多的提示,建议清理
达到 50 个勾选 Worktree 后弹出「任务工作区已达上限」清理确认弹窗,需选择清理范围(清理超过 7 / 15 / 30 天前的任务工作区分支和文件),确认后才能继续创建;取消则阻塞创建

别等到 50 个

每个 worktree 都是一份完整的工作目录副本。大型项目 50 个 worktree 能吃掉相当可观的磁盘。

养成习惯:任务做完、分支合并之后顺手清理。或者定期在数量提示出现时(25 个)就处理一次。

什么时候该用 Worktree ​

用普通任务开 Worktree
轻量改动、单点查询需要并行推进多个任务
只有一个 Agent 在干活多个 Agent 同时改代码
改动马上就要合回去隔离试验性方案,可能会丢弃
小项目,创建 worktree 的开销不值大项目,混在一起 diff 会乱

官方的建议原话是:轻量改动、单点查询使用普通任务即可;需要并行推进多个任务或隔离试验性方案时,再开启 Worktree。

创建 worktree 在大项目上要花几十秒到一分钟,这个成本对一次小修改来说不划算。

一个实际的用法 ​

假设你要同时推进三件事:修一个线上 bug、开发一个新特性、试一个重构方案。

text
任务 A(Worktree,base: main)
修复登录页在 Safari 下的白屏问题,先复现再改。

任务 B(Worktree,base: develop)
给设置页加一个导出配置的功能,参考 docs/api.md 里的格式约定。

任务 C(Worktree,base: main)
试试把状态管理从 Redux 换成 Zustand,只改 src/store 下面的,不要动组件。

三个任务在三个隔离目录里跑,各自有独立的分支。C 试崩了直接删掉分支,A 和 B 完全不受影响。

常见问题 ​

Q:worktree 里的改动怎么合回主仓库?

标准 Git 流程。任务分支是真实的 Git 分支,push、开 PR、merge 都照常。这就是「建立在 Git 原生语义之上」的意思。

Q:能在 IDE 里打开 worktree 目录吗?

能。~/WorkBuddy/Worktrees 下面就是普通的工作目录。任务列表里右键「打开文件夹」也能直接定位。

Q:清理 worktree 会删掉分支上的提交吗?

清理会移除 worktree 工作目录和对应的任务分支。分支上的提交如果没有 merge 或 push 到别处,就跟着没了。重要的改动先合并或推送。

Q:当前版本还有什么不支持的?

官方标注为 V1 版本,部分能力还在完善中,以你客户端里的实际表现为准。

进阶章节到此结束 ​

接下来两条路:

非官方社区教程 · 内容整理自 WorkBuddy 公开文档与实测记录 · 以官方最新说明为准