架构技术评论

Git Worktree:开启多任务并行开发新姿势

Image

在日常开发中,你是否遇到过这样的场景:

  • 正在 feature 分支写得起劲,突然接到一个紧急 hotfix 任务。
  • 你想对比两个分支的代码,但只能在一个窗口里切来切去。
  • 切换分支后,庞大的项目需要重新编译,白白浪费十几分钟。

通常我们会用 git stash 把当前的修改存起来,切到新分支处理完再切回来 pop。但如果任务多起来,stash 列表就会变得一团糟。

今天我们要介绍的 Git Worktree,就是解决这些痛点的“终极利器”。


什么是 Git Worktree?

git worktree 允许你在同一个本地仓库中,同时拥有多个独立的工作目录。

每个工作目录(Worktree)都可以指向不同的分支,且它们共享同一个 .git 目录(即共享所有的提交历史和对象)。

结构示意图

Git Worktree 结构示意图

如上图所示,你不需要克隆(clone)多次仓库,只需要在不同的文件夹里“检出”不同的分支即可。


为什么要用它?

1. 真正的并行开发

你可以同时打开两个 IDE 窗口:一个在写新功能,另一个在修 Bug。互不干扰,无需频繁切换分支。

2. 告别 Stash 混乱

不再需要为了临时切换而强行 commit 或 stash。你的工作现场永远是保留的。

3. 节省编译时间

在大型项目中,切换分支往往意味着大量文件的时间戳改变,导致编译器重新扫描。使用 Worktree,每个分支都有自己的文件夹,编译产物也是独立的,切换任务时几乎是“秒开”。

4. 共享仓库状态

因为它们共享同一个 .git 文件夹,你在一个 Worktree 里 fetch 了远程代码,在另一个 Worktree 里也能立刻看到,非常方便。


快速上手指南

使用 git worktree 只需掌握以下几个核心命令:

1. 添加一个新的工作树

假设你现在在 main 分支,想去 hotfix 分支修个 Bug:

# 命令格式:git worktree add <路径> <分支名>
git worktree add ../my-project-hotfix hotfix

这会在上一级目录创建一个 my-project-hotfix 文件夹,并自动切到 hotfix 分支。

为什么是 ../ (上层目录)?

在 git worktree add 命令中使用 ../ 来指定新工作树的路径是一种推荐的最佳实践。主要原因如下:

  1. 避免“嵌套仓库”的混乱
    :如果将新工作树创建在当前 Git 仓库的子目录下,虽然 Git 会自动忽略它,但对于某些 IDE 或文件搜索工具来说,可能会将其视为当前项目的一部分,导致索引混乱或搜索结果重复。
  2. 保持清晰的项目结构
    :将不同的工作树放在与主仓库平级的目录中(例如 /work/my-project/ 和 /work/my-project-hotfix/),可以使项目结构更清晰,方便管理和切换。
  3. 防止误操作
    :将工作树独立于主仓库之外,可以有效避免在主仓库中进行文件清理或移动操作时,意外影响到其他工作树的内容。

因此,将新工作树创建在当前目录的平级位置,能提供更好的隔离性和管理便利性。

2. 查看当前所有的工作树

想知道自己开了多少个“分身”?

git worktree list

3. 移除工作树

任务完成后,直接删除文件夹并清理记录:

# 命令格式:git worktree remove <路径>
git worktree remove ../my-project-hotfix

总结

git worktree 是一个被严重低估的 Git 功能。它比 git stash 更直观,比 git clone 多份仓库更节省空间和同步成本。

如果你经常需要在多个任务之间快速切换,或者受够了频繁切换分支带来的重新编译,那么 Git Worktree 绝对值得你一试!


最后,欢迎试用博主最近开发的项目:

1. MicroClaw : MicroClaw:用 Rust 构建 OpenClaw

2. SkillsYoga : SkillsYoga: 轻松管理你的本地 Skills (开源)