意项
39.91M · 2026-03-23
在实际的日常开发中,我们总是会有很多场景,需要来回切换分支,暂存代码,例如:
feature 分支开发新功能,写了一半,这个时候有紧急的生产问题要修复,需要切换到 release 分支做修复工作。feature 分支,其中一个 feature1 分支做了一些公共修复或其基类、工具类代码的修改,想同步到另一个 feature2 分支。git stash(暂存) ->git checkout release-> 修复 ->git checkout feature->git stash pop。feature1 提交 -> 切到 feature2 ->cherry-pick。git worktree 就是在同一个 Git 仓库中,通过共用同一套历史记录,让你能同时在多个不同的工作目录下并行开发、测试或修复多个分支,而无需来回切换或重新克隆。
git worktree有点像 git clone,在物理磁盘上存多一份代码,但是是用同一个 .git 目录管理。
假设现在有一个 main 分支,然后要切换到 hotfix 改 bug。
文件目录内容:
// git worktree add [worktree 目录地址] [分支名称]
git worktree add ./worktree-hotfix hotfix
如果没有 hotfix 分支,想在当前分支拉出一条新分支就加上 -b参数,即:git worktree add ./worktree-hotfix -b hotfix
成功之后会发现多了一个文件夹,里面的代码和 hotfix 分支的一样:
一般来讲,目录会设置为../worktree 目录名,和当前项目地址同级,比较好管理依赖,这里为了方便演示,就放在了项目内容。
worktree-hotfix 中修改bug,并提交代码cd worktree-hotfix
修改代码。
提交代码:git add . -> git commit -m "fix: 修复了一个 bug"-> git push。
然后代码就会推送到 hotfix 的远程分支上。
重点:
main分支,而./worktree-hotfix代表的是 hotfix 分支。这里有两种移除 worktree 分支的方式:
worktree-hotfix目录git worktree prune移除失效的记录remove 命令删除git worktree remove [目录名称]我这里本来就在 worktree-hotfix 目录,所以目录是./,如果你在根目录,目录名称是./worktree-hotfix。当然,也可以使用绝对路径
最后将 hotfix 分支合并到 release 或其他分支即可。
至此,就是通过 git worktree 完成一个紧急 bug 的修复的全过程。其他常见场景的 worktree 操作也是类似的。过程中可以通过 cd 命令在不同的分支上来回切换而不需要暂存文件。
查看当前有哪些 worktree,目录地址是什么,对应的分支是哪条:
git worktree list
将一个 worktree 目录移动到别的地方:
git worktree move ./worktree-hotfix ../
防止 worktree 被移动或被删除:
git worktree lock /Users/ut/Documents/learn/worktree-hotfix
git worktree unlock /Users/ut/Documents/learn/worktree-hotfix
git worktree 利用不同的 Agent 开发不同的功能,如 Agent1 在 worktree1 上工作,让 Agent2 在 worktree2 上工作,互相独立,互不影响。