Git Worktree 本身不解决 Composer 依赖变动问题,但它为依赖隔离提供了物理基础——每个 worktree 是独立目录,node_modules、vendor、.env 等运行时文件天然不共享;composer install 在不同 worktree 中互不影响,因其 vendor/ 默认生成于当前工作目录,且各 worktree 拥有独立的 composer.lock 和配置文件。

Git Worktree 本身不解决 Composer 依赖变动问题,但它为依赖隔离提供了物理基础——每个 worktree 是独立目录,node_modules、vendor、.env 等运行时文件天然不共享,这才是关键。
为什么 composer install 在不同 worktree 里互不影响
Composer 的依赖安装路径(vendor/)默认落在当前工作目录下。当你用 git worktree add ../hotfix vendor-hotfix 创建新 worktree 后,它就是一个全新目录,composer install 会在这个目录里重新生成 vendor/,和主工作树或其他 worktree 完全无关。
常见错误现象:在主 worktree 里 composer update monolog/monolog,然后切到另一个 worktree 执行 composer install,发现没生效——不是 bug,是预期行为:每个 worktree 的 composer.lock 和 vendor/ 是各自维护的。
- 每个 worktree 可以有自己的
composer.json修改(比如 dev-only 包),不会污染其他分支 -
composer.lock文件必须 commit 到对应分支,否则别人 checkout 该分支时composer install结果可能不一致 - 如果多个 worktree 共享同一份
composer.lock(比如通过符号链接),反而会破坏隔离性,不推荐
worktree + composer 的典型使用流程
假设你同时要修 hotfix 分支的紧急问题,又在 feature/payment 上开发新支付逻辑,两个分支对 stripe/stripe-php 版本要求不同:
- 先确保远程分支已同步:
git fetch origin hotfix/urgent feature/payment - 为主分支外的工作创建独立目录:
git worktree add ../hotfix-urgent hotfix/urgent - 再开一个:
git worktree add ../feature-payment feature/payment - 分别进入目录执行:
cd ../hotfix-urgent && composer install;cd ../feature-payment && composer install
注意:不要在主工作树里运行 composer install 后,期望其他 worktree 自动继承 vendor —— 它们之间没有自动同步机制。
GInstall OneClick — 一键安装 GitHub 项目:规划、克隆、安装 Node 依赖、运行开发脚本。适用于想要获取 GitHubNode.js 项目的用户。
容易被忽略的坑:.env 和 vendor 不会自动复制
Git Worktree 只复制 Git 跟踪的文件,.env、vendor/、node_modules/ 这些默认被 .gitignore 排除,所以新 worktree 是“干净”的,但也是“空的”。
- 每次新建 worktree 后,必须手动运行
composer install(或composer update),不能跳过 -
.env文件需单独复制(如cp .env ../hotfix-urgent/.env),否则 Laravel/Symfony 等框架启动失败 - 若项目依赖特定 PHP 扩展(如
ext-amqp),确保所有 worktree 使用的 PHP CLI 版本和扩展一致,否则composer install可能成功但运行时报错
要不要用 Branchlet 或自定义脚本?
纯手工管理多个 worktree 的 composer install 和 .env 复制确实容易漏步骤。Branchlet 这类工具的价值就体现在这里:它能在 git worktree add 后自动触发 composer install、复制指定配置文件、甚至运行 php artisan optimize 等后置命令。
但如果你只用两三个 worktree,写个简单 shell 函数更轻量:
wt-composer() {
git worktree add "$1" "$2"
cd "$1" && cp ../.env . && composer install
}
调用:wt-composer ../hotfix hotfix/urgent。比记一堆命令快,也比装新工具更可控。
真正麻烦的从来不是命令本身,而是每个 worktree 都得自己确认 composer.lock 是否 commit、PHP 版本是否匹配、.env 是否正确——这些细节不盯住,再多 worktree 也救不了依赖混乱。

















