Git Worktree 使用教程
一、什么是 Worktree?
如果你经常使用 Git,一定遇到过这样的场景:正在开发某个功能时,突然需要紧急修复一个 bug,或者查看另一个分支的代码。传统的做法是:
- 保存当前修改(stash)
- 切换到另一个分支
- 完成操作后再切换回来
这样做不仅麻烦,而且容易出错。Git Worktree 就是为了解决这个问题而生的。
Worktree 允许你同时检出多个分支,每个分支都有独立的工作目录,就像为你的仓库创建了多个“分身”。
二、为什么需要 Worktree?
考虑以下场景:
- 紧急修复:正在开发新功能,突然需要修复生产环境的 bug
- 并行开发:同时开发多个不相关的功能
- 代码审查:查看同事的代码而不影响当前工作
- 版本对比:同时打开两个版本的代码进行比较
传统的分支切换需要你清理工作区,而 Worktree 让你可以“鱼和熊掌兼得”。
三、基本用法
3.1 创建 Worktree
# 为指定分支创建新的 worktree
git worktree add ../feature-branch feature/awesome# 创建新分支并建立 worktree
git worktree add -b hotfix ../hotfix-branch
这里 ../feature-branch 是新 worktree 的目录路径(相对于主仓库),feature/awesome 是分支名。
3.2 查看所有 Worktree
git worktree list
输出示例:
/path/to/main abc123 [main]
/path/to/feature def456 [feature/awesome]
/path/to/hotfix ghi789 [hotfix]
3.3 删除 Worktree
# 删除 worktree(会自动删除关联目录)
git worktree remove ../feature-branch# 强制删除(即使有未提交的修改)
git worktree remove -f ../feature-branch
四、实际工作流示例
场景:紧急 bug 修复
假设你正在开发一个重要的新功能:
# 1. 当前在 main 分支开发新功能
cd ~/projects/myapp# 2. 突然需要修复紧急 bug,创建 hotfix worktree
git worktree add -b hotfix-1.2.1 ../myapp-hotfix# 3. 切换到 hotfix 目录
cd ../myapp-hotfix# 4. 修复 bug 并提交
vim src/error.js
git add .
git commit -m "修复紧急 bug"# 5. 切回主目录继续开发
cd ~/projects/myapp
# 所有修改都在,可以继续工作
场景:并行功能开发
# 创建三个不同的 worktree 用于不同任务
git worktree add ../feature-auth auth-overhaul
git worktree add ../feature-ui ui-redesign
git worktree add ../docs-update update-docs# 现在你可以:
# - 在 ~/projects/myapp 处理主任务
# - 在 ../feature-auth 处理认证功能
# - 在 ../feature-ui 处理界面重设计
# 互不干扰!
五、高级技巧
5.1 分离 HEAD 状态
# 为特定提交创建 worktree
git worktree add --detach ../review abc123def
这在代码审查时特别有用,可以查看特定提交的代码而不影响其他工作。
5.2 与远程分支同步
# 创建 tracking 远程分支的 worktree
git worktree add --track -b feature/remote ../remote-feature origin/feature/remote
5.3 清理已删除的 Worktree
# 如果手动删除了 worktree 目录,需要清理
git worktree prune
六、注意事项
- 目录位置:新的 worktree 必须放在不同的目录,不能是主仓库的子目录
- 分支限制:同一个分支不能同时被多个 worktree 检出(除非使用
--detach) - 性能:所有 worktree 共享同一个 .git 目录,所以创建很快,不占太多空间
- IDE 支持:大多数现代 IDE(VSCode、IntelliJ)都能很好地处理 worktree
七、与传统方式的对比
| 操作 | 传统方式 | Worktree 方式 |
|---|---|---|
| 切换分支 | git checkout + git stash |
直接进入对应目录 |
| 并行开发 | 需要克隆多个仓库 | 一个仓库,多个工作区 |
| 磁盘空间 | 每个克隆都是完整副本 | 共享 .git,节省空间 |
| 同步更新 | 需要分别 pull | 所有 worktree 同步更新 |
八、实用脚本示例
创建快速切换的别名(添加到 ~/.bashrc 或 ~/.zshrc):
# 快速创建 worktree
gitwt() {git worktree add ../"$1" "$1"
}# 快速列出 worktree
gitwt-list() {git worktree list
}# 快速删除 worktree
gitwt-remove() {git worktree remove ../"$1"
}
九、总结
Git Worktree 是一个被严重低估的功能。它解决了 Git 工作流中的一个痛点:如何在不中断当前工作的情况下处理其他任务。
对于以下人群特别有用:
- 需要处理紧急 bug 修复的开发者
- 同时进行多个功能开发的工程师
- 经常进行代码审查的技术主管
- 需要对比不同版本代码的测试人员
刚开始可能需要一点时间适应,但一旦习惯,你就会发现它极大地提高了工作效率。就像拥有了 Git 的“多重影分身之术”,让你同时出现在多个地方,处理多个任务。
最后的小建议:如果你从未使用过 Worktree,现在就可以尝试一下。从一个简单的场景开始,比如为代码审查创建一个临时的 worktree,体验这种“分身有术”的感觉。