✅ Git Worktrees 核心心法(一句话记住):
一个仓库,多文件夹,各文件夹对应独立分支,并行开发互不干扰,不用 stash,不用多克隆,用完即删
- 改 feature 分支时,临时切到 master 修 bug,当前分支的未提交代码完全不用动,不用 stash / 提交临时改动。
- 所有 worktree 共享同一个
.git 目录,节省磁盘空间,不用克隆多份仓库。
- 所有分支操作(pull/push/commit)在任意 worktree 执行都生效,本质还是同一个仓库。
- 主工作区 (main worktree):你最初
git clone 下来的那个文件夹,默认就存在。
- 链接工作区 (linked worktree):用
git worktree add 新增的文件夹,和主工作区共享 .git,每个链接工作区对应一个独立分支。
- 一个分支只能被一个 worktree 占用,Git 会自动保护,避免冲突。
进入你的主仓库目录(必须在主工作区执行所有 worktree 命令)
|
|
cd /你的主仓库路径 # 比如 cd ~/projects/my-git-repo |
|
|
# 格式:git worktree add [新文件夹路径] [分支名] git worktree add ../myrepo-dev dev # 新增文件夹myrepo-dev,检出dev分支 git worktree add ../myrepo-master master # 新增文件夹myrepo-master,检出master分支 |
- 路径建议:和主仓库同级,方便管理(如上
../xxx)。
- 如果分支不存在,加
-b 参数新建 + 检出:
|
|
git worktree add -b feature/login ../myrepo-login # 新建feature/login分支,并创建对应工作区 |
会显示:所有工作区的路径、对应分支、是否是「裸分支 / 锁定」,一目了然。
两种方式,推荐方式 1(Git 官方推荐,最安全):
|
|
# 格式:git worktree remove [工作区路径] git worktree remove ../myrepo-dev |
方式 2(手动删):先删文件夹,再清理缓存
|
|
rm -rf ../myrepo-dev git worktree prune # 清理Git中失效的worktree缓存 |
|
|
git worktree prune # 清理失效的worktree(比如手动删了文件夹没执行remove时用) git worktree move 源路径 目标路径 # 移动worktree文件夹位置 |
- 一个分支只能被一个 worktree 占用,Git 会报错阻止,强行操作会导致代码冲突。
- 不要手动删除 worktree 文件夹,一定要用
git worktree remove,否则会残留缓存,导致 list 里还能看到失效路径。
- 所有 worktree 共享
.git,所以不要修改任何 worktree 里的 .git 目录,会全量污染。
- 未提交的改动是属于对应 worktree 的,切换 worktree 文件夹即可直接继续开发,不用管其他工作区。
- 临时用的分支(比如修 bug、临时测试),用完立刻删对应的 worktree,保持整洁。
- 长期维护的分支(dev/master),可以保留对应的 worktree,不用反复创建删除。
- 在任意 worktree 里执行
git pull/push/commit 都可以,效果和主仓库完全一致。
所有场景前提:你当前在主工作区(比如 my-project),正在开发 feature/xxx 分支,代码写到一半、有未提交改动,完全不用 stash、不用 commit 临时代码,这是 worktree 的核心价值!
需求:master 有线上 bug → 基于 master 新建 bugfix 分支 → 单独开 worktree 修复 → 不影响当前开发的 feature 分支
|
|
# 1. 进入主仓库目录(必须!所有worktree命令都在这里执行) cd my-project # 2. 基于master,新建【bug修复分支】+ 同时创建对应的worktree(一步到位,核心命令) git worktree add -b bugfix/order-500 ../my-project-bugfix master # 3. 进入这个bug修复的独立worktree,安心改bug(此时你的feature分支代码完全没动) cd ../my-project-bugfix # 改bug → git add → git commit -m "fix: 修复订单500异常bug" → git push # 4. 提MR/PR,把bugfix/order-500合并到master,完成上线发布 # 5. 修复完成后,删除这个临时的bugfix worktree(用完即删,保持整洁) git worktree remove ../my-project-bugfix |
✅ 核心亮点:修复完回到原工作区,你的 feature 分支代码还是「写到一半」的状态,无缝继续开发,零心智负担。
需求:你正在 dev 分支开发需求 A,突然要同步开发需求 B → 开 2 个独立 worktree,互不干扰
|
|
# 主工作区:my-project → 检出dev,开发需求A(写到一半) cd my-project # 新建worktree1:开发需求B,基于dev新建分支feature/reqB git worktree add -b feature/reqB ../my-project-reqB dev # 新建worktree2:临时做个技术调研,基于dev新建分支feature/test git worktree add -b feature/test ../my-project-test dev |
✅ 此时你有 3 个文件夹:
my-project:需求 A
my-project-reqB:需求 B
my-project-test:技术调研
所有文件夹共享一个.git,每个文件夹是独立分支,改任何一个都不会影响其他,提交 /push 各自分支即可。
这是唯一「直接检出 master/dev」的合法场景:只看不改,用来核对生产代码、查历史逻辑,不做任何提交
|
|
cd my-project git worktree add ../my-project-master master |
✅ 进入my-project-master,只看代码、查日志,看完直接删除这个 worktree 即可。
|
|
# 1. 删除worktree git worktree remove ../my-project-bugfix # 2. 删除本地的bugfix分支(主工作区执行) git branch -d bugfix/order-500 # 3. 如果远程也有这个分支,合并后也删掉(可选) git push origin --delete bugfix/order-500 |
Git 的规则:一个分支,只能被一个 worktree 占用,如果报错 fatal: 分支xxx is already checked out at xxx,原因只有 2 个:
- 原因 1:这个分支已经开了对应的 worktree,去
git worktree list查看,用就行,不用重复创建;
- 原因 2:之前手动删了 worktree 文件夹,没执行
remove,缓存残留 → 执行git worktree prune清理缓存即可。