并行工作树

让项目会话跑在独立的 git worktree 上,改动落在独立分支;建在哪、怎么带未提交改动、完成后怎么合。

项目会话可以运行在独立的并行工作树中(会话标记一个「工作树」徽标),改动落在独立分支上,互不干扰。

入口在新会话页的「运行于」选择器:选好目标项目后,那一行是「运行于 某项目 · 本地/工作树 · 分支」,把模式切到「工作树模式」就会开一个隔离工作树。不是每条目标都能开:只有「一个在真实 git 检出里的普通文件夹、且当前有分支」才给工作树选项和一个可选分支;如果目标是一个多文件夹工作区、还没建项目、根本不是 git 检出、或者是个没有任何提交的空仓库,「工作树」这一项是灰的、写着「当前项目暂不支持」,模式回落成本地。原因很直接——多文件夹工作区里每个根是各自独立的仓库,压根没有「一个当前分支」可言。

合并现在是你在 git 侧自己做的普通操作,Klaus 不代劳:以前会话菜单里那个「合并回主仓」的按钮、以及它背后的合并通道都已经被整条删掉了。这么改是有意的——合并涉及冲突怎么解、合到哪条分支、要不要先提交,这些该由你在自己的 git 流程里决定,而不是让一个按钮替你拍板。工作树会话的 ⋯ 菜单里现在只剩「在 Finder 显示工作树」。

机制就是 git worktree:

  • 新建时在 ~/.klaus/worktrees/<仓库名>-<时间戳> 下 checkout 一个独立目录,并开一条 klaus/wt-<时间戳> 分支(可以指定基线 ref)。原仓库必须已经有至少一次提交,否则建不出来。
  • 新建时可以把主仓当前的未提交改动一起带进去——「运行于」那一行里有个「包括 N 个未提交的更改」开关(默认开):已跟踪文件的修改和删除、以及未跟踪的新文件都会复制过去,忽略文件留在原处。主仓本身原封不动,改动是复制而不是搬走。这个开关只在以当前 HEAD 为基线时生效,显式选了别的基线 ref 就不带,避免把两处状态混在一起。
  • 会话的工作目录指向那个独立目录,所以这条会话的改动只落在那条分支上。
  • 移除工作树是强制移除那个目录(不要这个隔离目录了就是本意),分支和提交都保留;删除工作树会话时也可以勾选一并移除工作树目录。
  • 只有 ~/.klaus/worktrees 里面的目录才算受管工作树,它是会话私有工作区,不会被当成你的项目。