worktree 是独立目录,产物与配置都隔离
一、两个典型症状
- 「为什么其他分支能直接编译出效果,你的却是独立的」 因为改动在隔离目录里,主目录跑的服务当然看不到。要看到效果只有两条路:进 worktree 目录启动服务,或把分支 merge / cherry-pick 回主目录(主目录若脏改动多,先评估冲突风险)。
- 「环境变量到底在哪个文件改」
看服务从哪个目录启动:在哪个目录跑
pnpm dev,就改哪个目录的.env.local。worktree 有自己的.env.local,改主目录那份不会生效。
二、可迁移的判断
- 配置是就近解析的,不是全局的:报错「key 没配」时先确认进程的工作目录,再确认改的是不是那份文件。
- 隔离目录的收益与代价是同一件事:好处是不污染主目录的一堆未提交改动;代价是产物与配置都不共享,必须显式合并或对齐。
- 分支 ≠ 目录。说「切到某个分支看效果」之前,先确认那个分支 checkout 在哪个目录。
- 分支是目录级状态,不是会话级:同目录开多个会话会互相抢分支(见 同目录多会话会抢分支)。
三、worktree 里连不上的两个变体
- 接口返回 500 空响应:
.env.local不被 Git 复制到新 worktree,认证配置校验失败 →POST /api/login返回 500 空体。做法是软链接到主项目那份(ln -s),链接不复制密钥,主项目改配置后两边同时生效。 - 所有页面 404:
next dev与next build共用apps/web/.next,生产构建覆盖了正在运行的开发路由产物 —— 进程还活着,路由清单已失效。跑next build前先停 dev。
另一个连带症状值得记住:前端假设「失败响应一定是 JSON」而直接 res.json(),空响应就抛 Unexpected end of JSON input,把真正的 500 错误遮住了。错误处理不健壮会把根因藏起来,排查时先看网络层的真实状态码,别被前端异常误导。
相关
- 功能缺失先确认运行的是哪份产物 —— 同一取向:先确认跑的是哪一份
- Cookie不区分端口所以同域多端口共享登录态 —— 同一 worktree 场景的另一半:cookie 与密钥
- 备用构建目录不要嵌在next目录里 —— 构建/运行目录的位置会影响行为
- 改版后旧路由仍指向旧实现 —— 同类:入口指向的不是你以为的那份