同一个仓库并行修改登录页、支付流程和文档时,最省心的办法是给每件事单独准备一个 worktree。Git 官方文档把它定义为与同一仓库关联的额外工作目录。各目录共享对象数据,每个目录保留自己的 HEAD、索引和工作区文件,也可以分别检出不同分支。
先确认主仓库和远端基线
开工前先看现有工作树,再更新远端跟踪引用。
git worktree list --porcelain
git fetch origin
git status --short --branch
--porcelain 提供稳定、便于检查的输出,里面有路径、提交和分支。git fetch origin 会下载远端对象,更新配置允许的远端跟踪引用及相关标签,还会写入 FETCH_HEAD。它不会把远端提交直接合进当前分支。当前目录已有未提交文件时,先把它们归属清楚,不要继续创建一个边界含糊的新任务。

为任务创建分支和目录
下面的命令从 origin/main 创建功能分支,并把它检出到相邻目录。
git worktree add -b codex/login-copy ../project-login-copy origin/main
进入新目录后再核对一次。
cd ../project-login-copy
git branch --show-current
git rev-parse HEAD
git status --short --branch
Git 默认会阻止同一个分支同时被两个 worktree 检出。这个保护很有用,强行绕过以后,两个窗口可能对同一分支产生互相看不见的状态变化。并行任务应当保持一件事一个分支,目录名也写出任务含义。
看懂共享与隔离的边界
关联工作树共享仓库对象和大部分引用。某个目录创建了提交,其他目录可以按提交号读取它。一个窗口执行 fetch 后,共享的 origin/main 也会更新。工作区文件和索引仍各自独立,A 目录里尚未提交的代码不会出现在 B 目录。
下面两条命令能把这个区别显示出来。
git rev-parse --git-common-dir
git rev-parse --git-dir
第一条在多个关联工作树中会指向共同管理目录,第二条会指向当前 worktree 自己的管理位置。分支引用属于共享信息,Git 才会阻止重复检出同一分支。看到另一个窗口刚创建的分支属于正常现象,看到它的未提交文件则说明目录边界已经被人为混用了。
并行任务还会争用构建端口、临时数据库和测试账号。Git 只隔离文件状态,这些外部资源需要单独命名。开发服务器启动前记录端口,测试数据写清任务前缀,避免代码没冲突,运行环境却互相覆盖。

工作期间只在自己的目录收口
每次提交前检查文件范围和差异。
git status --short
git diff --check
git diff --stat
另一个 worktree 推进了 main,不会自动改变当前目录。先让自己的工作区干净,再取得最新远端引用,随后决定 rebase 或由集成窗口合并。不要在一个脏目录里切去别人的分支处理顺手工作。
交接时报告目录、分支、HEAD 和工作区状态。接手者可以运行相同命令复核,不必根据文件夹名称猜这棵工作树属于哪个任务。若一个分支已经合并,也先保留 worktree,等测试记录和后续修复都确认结束,再由任务所有者批准清理。
任务合并并确认无需保留以后,可以从任意关联工作树执行清理。git worktree remove 会删除关联目录,同时清掉这棵 worktree 的管理记录。分支已经提交或推送,不能证明目录里没有只存在于本地的文件。
先从外部检查目标目录。
git -C ../project-login-copy status --porcelain=v1 --untracked-files=all
git -C ../project-login-copy status --ignored --short --untracked-files=all
git worktree list --verbose
第一条检查跟踪文件和没有被忽略的未跟踪文件,第二条补看 ignored 文件,最后一条显示 locked 等 worktree 状态。需要保留的本地数据库和环境文件应先移到明确位置,测试产物按项目规则处理。确认目录可以删除以后再执行。
git worktree remove ../project-login-copy
Git 默认拒绝移除有未跟踪文件或跟踪文件修改的 worktree。ignored 文件可能不会触发这项保护,却会随目录一起删除。含有子模块的 worktree 也可能被拒绝,locked worktree 需要更强的强制参数。看到拒绝信息时先查清原因,不要立即追加 --force。目录若被手工删除,git worktree list 可能把记录标为 prunable,先用 git worktree prune --dry-run 查看目标,再决定是否清理元数据。
