前言
最近使用 AI Vibe Coding 或工作中切换功能时,发现使用 git stash 不太方便,虽然听说过 git worktree 能解决这个问题,但懒得学。这次有空闲来认真学如何使用 git worktree 快速切换复杂的项目情境。
现有问题情境
假设在 A 分支你正写了一些 Code,但突然要到 B 分支修复问题,通常我会 git stash -m '描述写了某东西'
再 checkout 到 B 分支工作,结束后再 checkout 回来并 git stash apply
恢复 stash 的内容,大多时候这样的模式没有问题。
但我发现有时候要「同时开启不同分支交叉开发」就显得很麻烦,有时候我甚至会到 GitHub/GitLab 网页直接翻其他分支档案(可参考:分享一个我自己在预览 GitHub 专案时常用的诀窍 —— 点)或者是 clone 多个相同项目到本地预览。
git worktree
先查看存在的 worktree:git worktree list
,理所当然地没有任何东西。
/home/riceball/Desktop/git-projects/riceball-obsidian 628b009 [main]
添加新的 worktree:git worktree add 文件位置 目标分支
,可以发现上个资料夹新增了 new-post
资料夹且内容是 feat-new-post
分支。
riceball@joe-pc:~/Desktop/git-projects/riceball-obsidian$ git worktree add ../new-post feat-new-postPreparing worktree (checking out 'feat-new-post')
它们共用相同的 .git
记录,所以会比单纯 git clone
来得轻量。也可以移动现有 worktree:
git worktree move ../new-post ./foo
最后删除不要的 worktree:
git worktree remove ./foo
总结
git worktree 可以想象成是 git clone 下特定的分支,但又不用真的将整包历史记录抓下来,相较于 stash 更为灵活但又足够轻巧。可以搭配 stash 进行干净的工作区域切分,减少上下文情境切换的负担。
延伸阅读
- 使用 git worktree 管理一個本地儲存庫下的多個工作目錄副本 - The Will Will Web
- Git’s Best And Most Unknown Feature - ThePrimeagen