什么是 Git Worktree?
Git Worktree 是 Git 的一个功能,允许你在同一个 Git 仓库中同时拥有多个工作目录。每个工作树都可以指向不同的分支,使你能够在不切换分支的情况下并行工作。
基本用法
1. 创建新的工作树
csharp
# 创建新的工作树并切换到指定分支
git worktree add <路径> <分支名>
# 示例:在 ../feature-branch 目录创建新工作树并切换到 feature/x 分支
git worktree add ../feature-branch feature/x
# 创建新工作树并基于当前提交创建新分支
git worktree add -b <新分支名> <路径> [基础提交]
git worktree add -b new-feature ../new-feature
2. 列出所有工作树
bash
# 列出所有工作树
git worktree list
# 详细列出工作树信息
git worktree list --verbose
3. 切换到工作树
bash
# 直接切换到工作树目录
cd <工作树路径>
# 示例
cd ../feature-branch
4. 删除工作树
csharp
# 删除工作树(需要先确保工作树是干净的)
git worktree remove <工作树路径>
# 强制删除(即使有未提交的更改)
git worktree remove --force <工作树路径>
# 示例
git worktree remove ../feature-branch
5. 移动工作树
bash
# 移动工作树到新位置
git worktree move <原路径> <新路径>
# 示例
git worktree move ../old-location ../new-location
高级用法
1. 创建临时工作树
sql
# 创建临时工作树,在删除时会自动清理
git worktree add --detach <路径> [提交哈希]
git worktree add --detach ../temp-worktree HEAD~1
2. 锁定工作树
csharp
# 锁定工作树(防止意外删除)
git worktree lock <工作树路径>
# 解锁工作树
git worktree unlock <工作树路径>
3. 修复损坏的工作树
bash
# 修复工作树元数据
git worktree repair <工作树路径>
实用场景示例
场景1:同时处理功能和修复
bash
# 主工作区:开发新功能
cd /path/to/main/repo
git checkout develop
# 创建专门的工作树处理紧急修复
git worktree add -b hotfix ../hotfix main
cd ../hotfix
# 修复bug并提交
# 回到主工作区继续开发
cd /path/to/main/repo
场景2:代码审查
bash
# 创建专门的工作树来审查特定PR
git worktree add -b review-pr-123 ../review-pr-123 origin/pr-branch
cd ../review-pr-123
# 进行代码审查和测试
场景3:并行测试
bash
# 主工作区:继续开发
cd /path/to/main/repo
# 创建工作树运行长时间测试
git worktree add ../long-running-tests test-branch
cd ../long-running-tests
./run-long-tests.sh
管理多个工作树
查看工作树状态
css
# 查看所有工作树的状态
git worktree list
# 输出示例:
/path/to/main/repo abc1234 [main]
/path/to/feature-branch def5678 [feature/x]
/path/to/hotfix ghi9012 [hotfix]
清理过期工作树
bash
# 清理已删除的工作树记录
git worktree prune
# 先检查哪些会被清理
git worktree prune --dry-run
最佳实践
- 有意义的路径命名:使用描述性的目录名
- 定期清理:删除不再需要的工作树
- 注意磁盘空间:多个工作树会占用更多空间
- 使用相对路径:便于团队协作和路径一致性
- 文档化工作树用途:在团队中明确每个工作树的目的
常见问题解决
工作树删除失败
csharp
# 如果工作树目录已被手动删除
git worktree prune
# 如果工作树有未提交的更改,先提交或储藏
git add .
git commit -m "临时提交"
git worktree remove <路径>
工作树锁定问题
bash
# 查看锁定状态
git worktree list
# 强制解锁
git worktree unlock --force <路径>
Git Worktree 是一个强大的工具,特别适合需要同时在多个分支上工作的场景,可以显著提高开发效率。