前言
上一篇我们介绍了 Git Worktree 的基本用法。今天来点实战的!
假设你在一家快速发展的公司工作,同时负责:
- 主线功能开发(
feature 分支)
- v2.0 版本维护(
release/v2.0 分支)
- v1.0 紧急修复(
hotfix/v1.0 分支)
传统方式需要在三个分支间频繁切换,代码冲突、环境混乱…
让我们用 Git Worktree 来解决这些问题!
## 场景一:主线开发时紧急修复
问题描述
你正在 feature/new-dashboard 分支开发新功能,代码改到一半:
1 2 3 4 5 6 7 8 9
| cd ~/project git status
|
突然产品经理找你:”线上登录功能挂了,马上修复!”
传统方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| git stash save "WIP: new dashboard"
git checkout main
git checkout -b hotfix/login-bug
git add . git commit -m "Fix: login bug" git push origin hotfix/login-bug
git checkout feature/new-dashboard
git stash pop
|
使用 Worktree 方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| git worktree add ../hotfix-login -b hotfix/login-bug
cd ../hotfix-login
vim src/auth/login.js
npm test git add . git commit -m "Fix: login timeout bug" git push origin hotfix/login-bug
cd .. git worktree remove hotfix-login
cd ~/project git status
|
关键优势
- ✅ 不需要 stash,避免冲突风险
- ✅ 主分支工作完全不受影响
- ✅ 修复完成后一键清理
- ✅ 可以同时维护多个修复分支
## 场景二:多版本并行开发
项目背景
你们的软件有两个版本同时维护:
- v1.0:稳定版,老客户使用
- v2.0:新版,正在推广中
现在需要给两个版本都添加一个新功能。
传统方式的问题
1 2 3 4 5 6 7 8 9
| git checkout release/v1.0
git commit -m "Add user profile"
git checkout release/v2.0
|
Worktree 多版本方案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| ~/myapp/ ├── .git/ ├── v1.0/ ├── v2.0/ └── main/
cd ~/myapp git worktree add ../myapp-v1.0 release/v1.0 git worktree add ../myapp-v2.0 release/v2.0
cd ~/myapp-v1.0
vim src/features/user-profile.js
const api = 'https://api-v1.example.com/user';
git add . git commit -m "Add user profile (v1.0)"
cd ~/myapp-v2.0
vim src/features/user-profile.js
const api = 'https://api-v2.example.com/user';
git add . git commit -m "Add user profile (v2.0)"
cd ~/myapp-v1.0 git push origin release/v1.0 npm run deploy:v1.0
cd ~/myapp-v2.0 git push origin release/v2.0 npm run deploy:v2.0
|
实用技巧
为每个版本设置不同环境
1 2 3 4 5 6 7 8 9 10 11 12 13
| cd ~/myapp-v1.0 echo "14" > .nvmrc nvm use
cd ~/myapp-v2.0 echo "18" > .nvmrc nvm use
cd ~/myapp-v1.0 && npm run dev cd ~/myapp-v2.0 && npm run dev
|
版本对比
1 2 3 4 5 6
| diff ~/myapp-v1.0/src/auth/login.js ~/myapp-v2.0/src/auth/login.js
cd ~/myapp-v1.0 git diff ../myapp-v2.0/src/auth/login.js
|
## 场景三:代码审查与协作
问题场景
同事提交了一个 PR,你需要:
- 运行项目测试功能
- 尝试修改代码验证想法
- 审查通过后合并
审查流程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| cd ~/project git worktree add ../review-pr-456 origin/pr/456
cd ../review-pr-456
npm install npm run dev
vim src/components/Button.js npm run dev
cd .. git worktree remove review-pr-456
cd ../review-pr-456 git commit -am "Fix: review comments" git push origin pr/456 git worktree remove review-pr-456
|
批量审查多个 PR
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| git worktree add ../pr-123 origin/pr/123 git worktree add ../pr-456 origin/pr/456 git worktree add ../pr-789 origin/pr/789
git worktree list git worktree remove pr-123 git worktree remove pr-456 git worktree remove pr-789
|
## 场景四:重构实验
实验性重构
你想尝试一个大的重构方案,但不确定是否可行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| git worktree add ../experiment-refactor -b experiment/new-arch
cd ../experiment-refact
mv src/components/* src/views/ mv src/utils/* src/helpers/
cd .. git worktree remove experiment-refactor
cd ../experiment-refactor
git checkout main git merge experiment/new-arch git worktree remove experiment-refactor
|
A/B 测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| git worktree add ../experiment-a -b experiment/variant-a git worktree add ../experiment-b -b experiment/variant-b
cd ../experiment-a
vim src/algo/search.js
cd ../experiment-b
vim src/algo/search.js
cd ../experiment-a npm run benchmark
cd ../experiment-b npm run benchmark
cd ~/project git merge experiment/variant-b git branch -d experiment/variant-a
git worktree remove experiment-a git worktree remove experiment-b
|
## 高级技巧
1. Worktree 管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| git worktree list
git worktree list --porcelain
git worktree prune
git worktree move ../old-path ../new-path
git worktree lock ../important-branch git worktree unlock ../important-branch
|
2. 与 CI/CD 集成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| name: Test All Worktrees
on: [push, pull_request]
jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2
- name: Test Main run: npm test
- name: Setup Worktrees run: | git worktree add ../feature-A git worktree add ../feature-B
- name: Test Feature A working-directory: ../feature-A run: npm test
- name: Test Feature B working-directory: ../feature-B run: npm test
|
3. 自动化脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #!/bin/bash
if [ -z "$1" ]; then echo "Usage: git-worktree-helper <branch-name>" exit 1 fi
BRANCH=$1 WORKTREE_PATH=~/worktrees/$BRANCH
git worktree add $WORKTREE_PATH -b $BRANCH
cd $WORKTREE_PATH
if [ -f "package.json" ]; then npm install fi
if [ -f "package.json" ]; then npm run dev & fi
echo "Worktree created: $WORKTREE_PATH" echo "Branch: $BRANCH"
|
使用方式:
1 2
| git-worktree-helper feature/new-ui
|
4. IDE 集成
VS Code
1 2 3 4 5 6
| cd ~/project-v1.0 code .
cd ~/project-v2.0 code .
|
** IntelliJ IDEA**
每个 worktree 作为独立项目打开,可以:
5. 配置共享
1 2 3 4 5 6 7
| cd ~/project-v1.0 ln -s ~/project/.vscode .vscode ln -s ~/project/.eslintrc.js .eslintrc.js
git config --global include.path ~/.gitconfig-shared
|
## 注意事项
1. 磁盘空间
虽然 worktree 共享 .git 目录,但工作文件会占用空间:
1 2 3 4 5 6
| git worktree list git worktree remove ../unused-branch
du -sh ~/project*
|
2. 环境变量
不同 worktree 可能需要不同的环境:
1 2 3 4 5 6
| cd ~/project-v1.0 echo "API_URL=https://api-v1.example.com" > .env.local
cd ~/project-v2.0 echo "API_URL=https://api-v2.example.com" > .env.local
|
3. Git Hooks
确保 hooks 在所有 worktree 中正常工作:
1 2 3 4 5
| cd ~/project cp pre-commit .git/hooks/
|
4. 提交前检查
切换 worktree 前记得检查状态:
1 2 3 4 5 6 7
| git worktree list --porcelain | grep "worktree" | while read line; do path=$(echo $line | cut -d' ' -f2) echo "Checking $path..." cd $path git status done
|
## 常见问题解决
Q: Worktree 中 git fetch 没有更新?
1 2 3 4 5 6 7
| cd ~/project git fetch --all
cd ~/feature-branch git merge origin/feature-branch
|
Q: 删除 worktree 时提示有未提交的更改?
1 2 3 4 5 6 7 8 9
| git worktree remove ../branch --force
cd ../branch git add . git commit -m "WIP" cd .. git worktree remove ../branch
|
Q: Worktree 和 submodule 一起使用?
1 2 3 4 5 6
| git worktree add ../feature-branch feature/branch
cd ../feature-branch git submodule update --init --recursive
|
## 实战项目
让我们用一个完整的项目来练习:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| mkdir ~/demo-project cd ~/demo-project git init echo "# Demo Project" > README.md git add . && git commit -m "Initial commit"
git worktree add ../main-branch main
git worktree add ../feature-auth -b feature/auth
git worktree add ../hotfix-login -b hotfix/login
git worktree list
cd ~/main-branch echo "Main code" > main.js git add . && git commit -m "Add main code"
cd ~/feature-auth echo "Auth code" > auth.js git add . && git commit -m "Add auth feature"
cd ~/hotfix-login echo "Fix login" > login.js git add . && git commit -m "Fix login bug"
cd ~/demo-project git merge feature/auth git merge hotfix/login
git worktree remove main-branch git worktree remove feature-auth git worktree remove hotfix-login
|
## 总结
Git Worktree 实战要点:
| 场景 |
传统方式 |
Worktree 方式 |
| 紧急修复 |
stash/切换分支 |
创建临时 worktree |
| 多版本维护 |
频繁切换冲突 |
独立版本目录 |
| 代码审查 |
本地切换分支 |
独立审查环境 |
| 重构实验 |
担心破坏代码 |
安全实验空间 |
记住:
- 及时清理 - 用完的 worktree 及时删除
- 命名规范 - 使用描述性的目录名
- 定期检查 -
git worktree list 查看状态
- 善用 prune -
git worktree prune 清理无效记录
Git Worktree 是提升 Git 使用效率的利器,希望这些实战场景能帮助你更好地使用它!
Happy Coding!