这篇文章主要讲解 git worktree 在我日常开发工作流中的使用。
背景说明
先来看下我的工作场景。
首先,要开发一个新功能,此时拉取一个功能分支,如:"feat/xxx"。 然后测试说生产环境发现一个bug,需要紧急修复,此时拉取一个bug修复分支,如:"fix/yyy"。 接着,产品经理说一个紧急需求要做,没办法,再创建一个分支 ,如:"feat/zzz"。
对于这样一个场景,需要在多个分支里工作。我可不想每次代码写一半,然后贮藏起来,这样太麻烦了。
这样,git worktree 就派上用场了。
官方对这个命令的描述是:一个 git 仓库可以支持多个工作区,允许你一次签出多个分支。
使用
基础命令
添加新的工作区
bash
git worktree add <路径> <分支名>
例如,为修复 bug 创建一个新的工作区:
bash
git worktree add ../fix-yyy fix/yyy
这会在当前目录的外层创建一个名为 fix-yyy 的目录,这个目的会处于 fix/yyy 分支。
基于远程分支创建工作区
如果分支在远程仓库但本地没有,可以直接基于远程分支创建:
bash
git worktree add ../fix-yyy origin/fix/yyy
创建新分支的工作区
如果分支还不存在,使用 -b 参数创建新分支:
bash
git worktree add -b feat/zzz ../feat-zzz
查看所有工作区
bash
git worktree list
输出示例:
javascript
D:/project/main abc1234 [main]
D:/project/fix-yyy def5678 [fix/yyy]
D:/project/feat-zzz ghi9012 [feat/zzz]
删除工作区
工作区可以使用下面命令删除:
bash
git worktree remove <工作区路径>
清理工作区记录
有时工作区目录被手动删除,但 Git 还记录着,可以用以下命令清理:
bash
git worktree prune
实战案例
让我用一个完整的案例演示如何使用 git worktree 管理多个工作分支。
场景:
- 主项目在
D:\projects\myapp目录 - 正在
main分支开发新功能 - 突然需要修复生产环境 bug
- 同时产品经理要求紧急开发一个新功能
步骤 1:查看当前状态
bash
cd D:\projects\myapp
git worktree list
输出:
javascript
D:/projects/myapp a1b2c3d [main]
步骤 2:为 bug 修复创建工作区
bash
# 拉取远程最新代码
git fetch origin
# 基于远程的 hotfix 分支创建工作区
git worktree add ../myapp-hotfix origin/hotfix/fix-login-issue
# 或者创建新的 hotfix 分支
git worktree add -b hotfix/fix-payment ../myapp-hotfix
步骤 3:为紧急需求创建工作区
bash
git worktree add -b feat/urgent-feature ../myapp-urgent
步骤 4:查看所有工作区
bash
git worktree list
输出:
javascript
D:/projects/myapp a1b2c3d [main]
D:/projects/myapp-hotfix e4f5g6h [hotfix/fix-payment]
D:/projects/myapp-urgent i7j8k9l [feat/urgent-feature]
步骤 5:在不同工作区之间切换
现在你可以在不同的目录中工作,无需切换分支:
bash
# 修复 bug
cd D:\projects\myapp-hotfix
# ... 编写代码,提交
git add .
git commit -m "fix: 修复支付问题"
git push origin hotfix/fix-payment
# 开发紧急功能
cd D:\projects\myapp-urgent
# ... 编写代码,提交
git add .
git commit -m "feat: 添加紧急功能"
git push origin feat/urgent-feature
# 回到主开发
cd D:\projects\myapp
# 继续原来的工作
步骤 6:完成后清理工作区
当分支合并完成后,删除不再需要的工作区:
bash
# 删除 hotfix 工作区
git worktree remove ../myapp-hotfix
# 删除紧急功能工作区
git worktree remove ../myapp-urgent
# 清理已删除工作区的记录
git worktree prune
最佳实践
1. 统一的目录结构
建议将所有工作区放在同一父目录下,便于管理:
bash
projects/
├── myapp/ # 主工作区(main 分支)
├── myapp-dev/ # 开发分支
├── myapp-feat1/ # 功能分支 1
├── myapp-feat2/ # 功能分支 2
└── myapp-hotfix/ # 热修复分支
2. 命名规范
工作区目录命名建议包含项目名和分支类型:
<项目>-<分支类型>例如:myapp-dev,myapp-hotfix<项目>-<功能描述>例如:myapp-payment,myapp-auth
3. 定期清理
定期检查并清理不再使用的工作区:
bash
# 查看所有工作区
git worktree list
# 删除不需要的工作区
git worktree remove <路径>
# 清理记录
git worktree prune
总结
git worktree 是一个非常实用的功能,特别适合需要频繁在多个分支之间切换的场景。