你有没有遇到过这种情况?正在开发一个复杂的新功能,代码写到一半,突然接到紧急 Bug 需要立刻修复。
为了切换分支,你只好心不甘情不愿地执行 git stash 藏起半成品的代码。修完 Bug 切回来后,还要小心翼翼地 git stash pop,甚至有时候还会遇到代码冲突的噩梦。
其实 Git 早就有一个超强的工具能解决这个痛点,那就是 Git Worktree。
告别混乱的切换与 Stash,用 Worktree 开启多线程开发
这篇文章带你一次搞懂它的核心运作与实战用法。
Git Worktree 与 Git Branch 有什么不同?
要搞懂 Git Worktree,我们先厘清它和 Git Branch 的差别。
我们可以把版本控制想象成在读一本书:
Commit是 书本的版本Branch是 夹在某页的书签Worktree则是 让你摊开书本的工作桌
传统做法中,我们只有一张工作桌。每当要切换书签时,就必须把桌面上正在修改的纸张全部收起来或藏进抽屉(也就是 git stash)。
而 Git Worktree 则允许你同时拥有好几张 独立的工作桌。
| 比较项目 | Git Branch | Git Worktree |
|---|---|---|
| 工作区概念 | 共享单一实体工作目录 | 拥有多个独立的实体工作目录 |
| 切换分支代价 | 需提交、Stash 或暂存变更 | 无需 Stash,直接切换目录即可 |
| 隔离安全性 | 未提交文件可能产生冲突或残留 | 目录完全隔离,变更互不干扰 |
| 历史纪录 | 共享 Git Commit 历史与分支 | 共享 Git Commit 历史与分支 |
不同 Worktree 的目前分支、暂存区与未提交修改完全独立,但它们彼此会 共享所有的 Commit 历史与分支纪录。
Branch 是版本书签,Worktree 是实体工作桌
这样一来,你需要切换任务时,只要开启另一个文件夹目录即可,完全不需要变动当前的开发状态。
如何开始使用 Git Worktree?
在实际项目中导入 Git Worktree 时,良好的目录规划能让开发更顺畅。
建议把原本 git clone 下来的项目目录当作干净的 main 总部,并将新建的 Worktree 目录放在项目外层(例如 ../my-app-worktrees),避免开发工具递归扫描文件夹时出错。
常用的指令流程如下:
| 流程 | 指令 |
|---|---|
| 1. 建立新 Worktree 并同时建立新分支 | git worktree add ../my-app-worktrees/feature-login -b feature-login |
| 2. 查看目前所有的 Worktree 清单 | git worktree list |
Git Worktree 特别适合用来管理 AI Agent 的开发任务。
你可以给 AI Agent 一个独立的 Worktree 目录让它尽情修改与测试,而人类开发者可以在另一个 Worktree 进行代码审查(Review)与测试。
给 AI Agent 独立的 Worktree,让 AI 开发与人类审查可以平行处理
两者在各自的实体目录中运作,既安全又清晰。
开发完成后如何合并与安全清理?
当你在独立的 Worktree 完成开发后,接下来该如何将成果合并并进行清理?
请记住一个重要观念:Worktree 目录本身不需要合并,真正要合并的是 Branch 分支。
你只需要回到 main 的工作桌目录,直接执行 git merge 对应的功能分支即可完成整合。
清理时请依照标准的二步骤流程:
| 步骤 | 指令 |
|---|---|
| 1. 移除 Worktree 实体目录 | git worktree remove ../my-app-worktrees/feature-login |
| 2. 删除已完成的功能分支 | git branch -d feature-login |
先移除 Worktree 目录,再删除 Branch 分支
请务必使用 git worktree remove 指令来清理,而不是直接在文件资源管理器中手动删除文件夹。
使用 Git Worktree 有哪些常见陷阱?
虽然 Git Worktree 非常方便,但在使用时有几个地雷需要特别注意。
陷阱 1: 未提交的修改会遗失
虽然删除 Worktree 不会删除 Branch 分支,但如果你在该目录还有没 commit 的变更,强制删除 Worktree 目录就会导致那些未提交的修改付之一炬。
陷阱 2: 分支占用冲突
Git 的保护机制 不允许同一个 Branch 分支同时在两个不同的 Worktree 中 Checkout。如果你试图在第二个 Worktree 切换到已经被占用的分支,Git 会直接阻挡并抛出错误信息。
强制删除 Worktree 会失去尚未 Commit 的变更
只要掌握好这些特性与原则,就能避免踩坑。
结论
通过 Git Worktree,我们可以彻底告别混乱的分支切换与 git stash 流程,实现真正的多线程开发。
下次不管是遇到紧急 Bug 需要修复、同时推进多个功能,还是指派任务给 AI Agent 协助写代码,不妨试着开一张新的工作桌吧!