Git Worktree 保姆级教程:AI编程必备技能!带你熟练掌握!

张开发
2026/4/18 12:03:40 15 分钟阅读

分享文章

Git Worktree 保姆级教程:AI编程必备技能!带你熟练掌握!
前言你有没有遇到过这种情况——正在feature-a分支上写代码写得正起劲产品经理突然跑过来线上 bug马上修这时候你只有两个选择git stash存一下切到main修完 bug再切回来git stash pop恢复现场硬着头皮 commit 一个 WIP 提交切分支修完再切回来不管哪种方式都要打断手头的工作IDE 里打开的文件全部变了心态也跟着乱了。今天要介绍的git worktree命令能彻底解决这个问题——让你在同一个仓库里同时检出多个分支每个分支都有独立的工作目录互不干扰。这篇文章会带你从零上手 worktree所有命令都在 Windows 上实测可跑。看完跟着练一遍半小时就能掌握。一、分支和 Worktree 到底有什么区别这是很多人容易混淆的地方先把概念理清楚。分支Branch是什么分支本质上是一个指向某个 commit 的可移动指针。它非常轻——在.git/refs/heads/目录下就是一个小文件里面存着 commit 的 hash 值。一个 Git 仓库可以有无数个分支但有个关键限制同一时刻工作目录只能检出一个分支。切换分支的时候Git 会改写你工作目录里的所有文件。Worktree 是什么Worktree 是实际存放文件的工作目录。默认情况下一个仓库只有一个 worktree就是你 clone 下来的那个文件夹。git worktree add命令允许你为同一个仓库创建多个独立的工作目录每个目录可以检出不同的分支。两者对比一目了然对比项分支Worktree本质指向 commit 的指针实际的文件目录数量限制可以无限多每个分支同时只能被一个 worktree 检出切换成本需要 stash/commit 未保存改动不需要切换直接cd过去开销几乎为零占用磁盘空间一份工作文件一个形象的比喻分支像是书签——你可以在书里夹无数个书签但同时只能翻开一页来读。Worktree 像是同一本书的多份副本——每份可以翻到不同的页同时阅读但内容Git 历史是共享的。二、Worktree 是不是复制一份项目很多人第一次看到 worktree 创建新目录都会问这个问题。答案是表面像本质不是。关键区别worktree 只复制工作文件不复制.git仓库本身。普通 clone真的复制project-a/ ├── .git/ ← 完整的 Git 历史可能几百 MB └── src/, ... ← 工作文件 ​ project-b/ ← 完全独立的另一份 ├── .git/ ← 另一份完整的 Git 历史 └── src/, ...Worktree共享 .gitproject/ ← 主 worktree ├── .git/ ← 完整的 Git 仓库 └── src/, ... ← 检出 main 分支的文件 ​ project-feature/ ← 新增 worktree ├── .git ← ⚠️ 这是个文件不是文件夹内容是指向主 .git 的路径 └── src/, ... ← 检出 feature-a 分支的文件这带来四个重要特性1. 磁盘占用小Git 历史只有一份。500MB 的.gitclone 两次就是 1GB但 worktree 只多占工作文件的空间。2. 提交历史实时共享在 worktree A 里git commit后立刻在 worktree B 里git log就能看到。不需要 push/pull。3. 同一分支不能双开Git 会阻止两个 worktree 同时检出同一分支防止改乱。4. 必须用专门命令删除不能直接rm -rf或者资源管理器删文件夹要用git worktree remove。三、实战演练10 个练习带你上手下面的练习请跟着一步步敲所有命令在Windows 的 Git Bash 或 PowerShell下都能运行。准备工作建议在一个空目录里练习cd C:\Users\你的用户名\Desktop mkdir worktree-practice cd worktree-practice ​ # 初始化一个新仓库 git init demo cd demo ​ # 做几次提交让仓库有点内容 echo Hello README.md git add . git commit -m initial commit ​ echo version 1 app.txt git add . git commit -m add app.txt ​ # 建两个分支方便后面演示 git branch feature-a git branch feature-b现在你有一个仓库三个分支main、feature-a、feature-b。练习 1查看当前 worktreegit worktree list输出类似C:/Users/.../demo abc1234 [main]目前只有一个——就是你所在的主 worktree。练习 2添加第一个 worktree为feature-a分支创建独立的工作目录# 语法git worktree add 路径 分支名 git worktree add ../demo-feat-a feature-aGit 会在上级目录创建demo-feat-a文件夹里面自动检出feature-a分支的文件。再查看一次git worktree list现在有两条记录了。练习 3在新 worktree 里工作# 切到新 worktree cd ../demo-feat-a ​ # 确认当前分支 git branch --show-current # feature-a ​ # 做点改动并提交 echo feature a work feature-a.txt git add . git commit -m work on feature a ​ git log --oneline练习 4见证共享 .git的神奇之处# 切回主 worktree cd ../demo # 当前仍在 main 分支 git branch --show-current # main # 但能立刻看到 feature-a 上刚才的 commit git log feature-a --oneline无需 push/pullcommit 立刻在两边同步可见——这就是共享.git的威力。练习 5体验同一分支不能双开git worktree add ../demo-feat-a-2 feature-a会报错fatal: feature-a is already checked out at ...这是故意的——Git 防止你同时在两个地方改同一分支造成混乱。练习 6创建新分支 worktree一步到位这是最常用的操作开新分支同时放到新目录。# -b 参数新建分支并检出到新 worktree git worktree add -b hotfix ../demo-hotfix main意思是基于main新建hotfix分支检出到../demo-hotfix目录。cd ../demo-hotfix git branch --show-current # hotfix练习 7临时查看某个历史版本想看看某个旧 commit 的代码但不想污染分支名cd ../demo git log --oneline # 找到想看的 commit hash # --detach创建不绑定分支的临时 worktree git worktree add --detach ../demo-inspect commit的hash cd ../demo-inspect # 这里的文件是那个 commit 时刻的快照随便看随便测试练习 8正确删除 worktree⚠️不要用资源管理器直接删文件夹会留下残留元数据正确做法# 回到主 worktree不能在要删的 worktree 里面执行 cd ../demo git worktree remove ../demo-inspect git worktree remove ../demo-hotfix如果 worktree 里有未提交的改动remove会拒绝加--force强制删除git worktree remove --force ../demo-hotfix练习 9清理残留元数据如果不小心手动删了 worktree 文件夹Git 还会记得它git worktree prune执行后git worktree list就干净了。练习 10实战场景演练模拟真实场景正在feature-a开发突然线上有 bug 要修main。cd ../demo-feat-a # 假装在写一半的代码未 commit echo work in progress feature-a.txt # 传统方式需要 stash 或强行 commit # 但用 worktree直接开新的 cd ../demo git worktree add -b hotfix-urgent ../demo-hotfix main cd ../demo-hotfix # 在这里专心修 bug echo bug fixed fix.txt git add . git commit -m urgent fix # 修完了切回原来的工作 cd ../demo-feat-a cat feature-a.txt # work in progress 还在这就是 worktree 最大的价值——上下文无缝切换写到一半的代码完好保留。四、修完的 hotfix 怎么合并回 mainWorktree 不改变合并逻辑流程和普通分支合并完全一样。基本合并流程# 切到主 worktreemain 分支所在那个 cd ../demo git branch --show-current # main # 合并 git merge hotfix-urgent完成。git log --oneline可以看到 hotfix 的 commit 已经进入 main 的历史。合并后清理顺序很关键必须先删 worktree再删分支git worktree remove ../demo-hotfix # 1. 先删 worktree git branch -d hotfix-urgent # 2. 再删分支反过来 Git 会报错说分支还被 worktree 占用。三种常见的合并方式方式 1普通 merge会产生合并 commit保留分叉历史git merge hotfix-urgent方式 2Fast-forward线性历史如果 main 分出 hotfix 后没有新 commit默认就是 fast-forward——直接把 main 指针挪到 hotfix 的最新 commit。git merge --no-ff hotfix-urgent # 强制产生合并 commit git merge --ff-only hotfix-urgent # 只允许 fast-forward否则失败方式 3Rebase 后合并最干净的历史cd ../demo-hotfix git rebase main # 把 hotfix 基于最新 main 重放 cd ../demo git merge hotfix-urgent # 此时必然是 fast-forward⚠️已推送到远程并被他人拉过的分支不要 rebase会出问题。推荐的完整流程cd ../demo git checkout main git merge --no-ff hotfix-urgent # 保留合并点方便追溯 git worktree remove ../demo-hotfix # 清理 worktree git branch -d hotfix-urgent # 清理分支 git push origin main # 推送如果有远程仓库处理合并冲突git merge hotfix-urgent # CONFLICT (content): Merge conflict in xxx.txt处理步骤# 1. 查看冲突文件 git status # 2. 打开冲突文件会看到这样的标记 # HEAD # main 的内容 # # hotfix 的内容 # hotfix-urgent # 手动编辑成想要的样子删掉所有 、、 标记 # 3. 标记为已解决 git add xxx.txt # 4. 完成合并 git commit # 想放弃合并就用 git merge --abort五、常用命令速查表收藏这张表用的时候直接查# 查看 git worktree list # 列出所有 worktree # 创建 git worktree add 路径 分支 # 为现有分支加 worktree git worktree add -b 新分支 路径 起点 # 新建分支并加 worktree git worktree add --detach 路径 commit # 临时查看某个 commit # 删除 git worktree remove 路径 # 删除 worktree git worktree remove --force 路径 # 强制删除有未提交改动时 git worktree prune # 清理已被手动删除的残留元数据六、Windows 用户特别提示路径分隔符Git 命令里/和\都能用。Git Bash 推荐/PowerShell 推荐\。删不掉 worktree 怎么办大概率是 VS Code 之类的 IDE 还开着那个文件夹关掉再删。推荐用 Git Bash本文所有命令在 Git Bash 里体验最一致。PowerShell 也能跑但echo等少数命令行为略有不同。七、最佳实践总结经过练习这几条建议能让你少踩坑合并操作永远在主 worktree 里做不要在临时 worktree 里 merge命名要有规律比如项目名-分支名demo-feat-a、demo-hotfix方便辨识用完立刻清理别让废弃的 worktree 堆积牢记删除顺序先worktree remove再branch -d不要用文件管理器直接删 worktree 目录要用 Git 命令结语git worktree是 Git 里一个被严重低估的功能特别适合以下场景多分支并行开发紧急 bug 修复不打断当前工作Code review 时独立环境跑别人的代码多个 AI agent比如 Claude Code并行工作避免冲突掌握它之后你会发现git stash的使用频率大大降低工作流程顺畅很多。跟着本文的练习走一遍worktree 就彻底拿下了。如果觉得有用点赞收藏支持一下有问题评论区见如果本文对你有帮助欢迎点赞、收藏、关注三连你的支持是我持续创作的动力

更多文章