Use Git Worktree to Reduce Burden of Context Switching

使用 Git Worktree 快速切换复杂的项目情境

前言

最近使用 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,理所当然地没有任何东西。

Terminal window
/home/riceball/Desktop/git-projects/riceball-obsidian 628b009 [main]

添加新的 worktree:git worktree add 文件位置 目标分支,可以发现上个资料夹新增了 new-post 资料夹且内容是 feat-new-post 分支。

Terminal window
riceball@joe-pc:~/Desktop/git-projects/riceball-obsidian$ git worktree add ../new-post feat-new-post
Preparing worktree (checking out 'feat-new-post')

它们共用相同的 .git 记录,所以会比单纯 git clone 来得轻量。也可以移动现有 worktree:

Terminal window
git worktree move ../new-post ./foo

最后删除不要的 worktree:

Terminal window
git worktree remove ./foo

总结

git worktree 可以想象成是 git clone 下特定的分支,但又不用真的将整包历史记录抓下来,相较于 stash 更为灵活但又足够轻巧。可以搭配 stash 进行干净的工作区域切分,减少上下文情境切换的负担。

延伸阅读