Git Worktree 完全指南:告别分支切换焦虑

Share
Git Worktree 完全指南:告别分支切换焦虑
Photo by Yancy Min / Unsplash
在多个分支间频繁切换,每次都要重新加载环境、重启服务?git worktree 让你同时拥有多个工作目录,互不干扰,效率翻倍。

为什么需要 Worktree?

日常开发中,我们经常面临这样的场景:

  • 正在 feature 分支开发新功能,突然要紧急修复 hotfix 分支的 Bug
  • 想同时对比两个分支的代码差异,或者并行跑两个版本的服务
  • 每次切换分支,IDE 都要重新索引,编译缓存失效,等待时间漫长

常规的 git checkoutgit switch 虽然能切换分支,但同一时间只能在一个分支上工作。如果你切走再切回来,之前的环境(如依赖安装、编译产物)可能已经丢失或需要重建。

git worktree 的解决方案:在同一个 Git 仓库中,创建多个独立的工作目录,每个目录对应不同的分支,它们共享同一个 .git 对象库(节省磁盘空间),但各自拥有独立的工作区、暂存区和索引。

环境准备

  • Git 版本要求:2.5+(推荐 2.15+,功能更完善)
  • 查看版本:git --version

一、新增 Worktree

1.1 基于已有分支创建

语法:git worktree add <新目录路径> <分支名>

示例:

git worktree add ../my-project-hotfix hotfix

效果:

  • 在当前目录的上一级创建 my-project-hotfix 文件夹
  • 该目录自动切换到 hotfix 分支
  • 你可以像操作一个独立的 Git 仓库一样,在里面正常 addcommitpush

1.2 基于新分支创建

语法:git worktree add -b <新分支名> <路径>

示例:

git worktree add -b new-feature ../my-project-feature

效果:

  • 创建新分支 new-feature(基于当前 HEAD)
  • 在新目录中检出该分支

1.3 基于远程分支创建

示例:

git worktree add ../my-project-remote origin/develop

效果:

  • 基于远程 develop 分支创建一个本地跟踪分支(自动命名)
  • 适合临时查看或测试远程分支代码

1.4 指定分支基点创建

语法:git worktree add -b <新分支名> <路径> <基点>

示例:

git worktree add -b hotfix-v2 ../project-hotfix-v2 v1.0

效果:

  • 基于 v1.0 这个 tag 创建 hotfix-v2 分支并检出

1.5 查看所有 Worktree

git worktree list

输出示例:

/path/to/main-repo          abc123 [main]
/path/to/../project-hotfix  def456 [hotfix]
/path/to/../project-feature 789xyz [new-feature]

二、删除 Worktree

2.1 标准删除方式(推荐)

先进入主仓库目录:

cd /path/to/main-repo

删除指定 worktree:

git worktree remove <worktree路径>

示例:

git worktree remove ../my-project-hotfix

这个命令会:

  • 删除对应的整个文件夹及其内容
  • 清理 .git/worktrees/ 下的注册信息
  • 更新内部引用,避免残留

2.2 处理未提交的修改

如果 Worktree 中有未提交的修改,命令会拒绝执行。你可以选择:

方式一:先提交

git add . && git commit -m "save work"

方式二:暂存起来

git stash

方式三:强制删除(丢弃所有未提交修改)

git worktree remove -f <路径>

2.3 如果文件夹已被手动删除

如果你已经直接用 rm -rf 或资源管理器删掉了文件夹,执行:

git worktree prune

这个命令会自动清理所有已经不存在的 worktree 残留记录。

2.4 移动 Worktree 位置

如果需要移动一个 worktree 到其他位置:

# 1. 先正常删除
git worktree remove <旧路径>

# 2. 重新添加到新位置
git worktree add <新路径> <分支名>

注意:如果该分支没有其他 worktree 在使用,可以重新添加。

2.5 删除主仓库本身

主仓库(最初 git clone 的那个目录)不能通过 git worktree remove 删除,只能手动删除整个文件夹:

rm -rf /path/to/main-repo

删除前请确认所有 worktree 已清理完毕。

三、操作速查

新增(基于已有分支)

git worktree add <路径> <分支>

新增(基于新分支)

git worktree add -b <新分支> <路径>

新增(基于指定基点)

git worktree add -b <新分支> <路径> <基点>

列出所有 worktree

git worktree list

列出详细信息

git worktree list --verbose

删除(标准)

git worktree remove <路径>

强制删除(丢弃修改)

git worktree remove -f <路径>

清理残留记录

git worktree prune

锁定 worktree(防止误删)

git worktree lock <路径>

解锁 worktree

git worktree unlock <路径>

修复 worktree 状态

git worktree repair <路径>

查看帮助

git worktree --help

四、常见问题

问:一个分支能同时被多个 worktree 检出吗?

不能。一个分支同时只能被一个 worktree 检出。

问:删除 worktree 后分支还在吗?

在。分支引用保留在主仓库中,不会因为 worktree 删除而丢失。

问:worktree 之间会互相影响吗?

不会。各自有独立的暂存区和工作区,互不干扰。

问:主仓库能用 remove 删除吗?

不能。主仓库只能手动删除整个文件夹。

问:删除前有未提交修改怎么办?

先 commit 或 stash,或者用 -f 强制丢弃。

问:worktree 可以跨磁盘分区吗?

建议在同一文件系统内使用,跨分区可能遇到问题。

问:可以嵌套创建 worktree 吗?

不建议。worktree 目录不能再作为主仓库创建新的 worktree。

问:如何保留文件夹但注销 worktree?

不支持直接保留。可以先 mv 移走文件夹,再执行 git worktree prune 清理记录。

五、实用场景示例

场景一:并行开发与修复

# 主仓库在 main 分支,开发新功能中
git worktree add -b feature-login ../project-login

# 突然收到 hotfix 紧急任务
git worktree add ../project-hotfix hotfix

# 现在你可以:
# - 终端1:在 ../project-login 中继续开发
# - 终端2:在 ../project-hotfix 中修复 Bug
# - 互不干扰,随时切换!

场景二:代码对比与测试

git worktree add ../project-v1 v1.0
git worktree add ../project-v2 v2.0

# 分别进入两个目录,跑起服务,对比功能差异或性能表现

场景三:快速 Code Review

git worktree add -b review-pr ../project-pr origin/pull/123/head
cd ../project-pr
# 查看代码、运行测试,不影响当前开发环境

场景四:Git Bisect 调试

# 用 worktree 进行二分查找,不影响主工作区
git worktree add -b bisect-work ../project-bisect
cd ../project-bisect
git bisect start
git bisect bad HEAD
git bisect good v1.0
# 开始二分查找...

场景五:同时维护多个版本

# 同时维护 v1.x 和 v2.x 两个大版本
git worktree add ../project-v1 v1-branch
git worktree add ../project-v2 v2-branch

# 两个版本可以同时编译、测试、部署

六、进阶技巧

6.1 配合别名简化操作

~/.gitconfig 中添加:

[alias]
    wt = worktree
    wta = worktree add
    wtr = worktree remove
    wtl = worktree list
    wtp = worktree prune

之后使用更简洁:

git wta ../new-feature feature
git wtl
git wtr ../new-feature

6.2 锁定与解锁

防止误删除或修改:

git worktree lock <路径>
git worktree unlock <路径>

被锁定的 worktree 无法被 removeprune

6.3 修复异常状态

如果 worktree 出现异常,可以修复:

git worktree repair <路径>

七、注意事项

  • 所有 worktree 共享 .git/objects,节省磁盘空间,但不要手动修改 .git 目录
  • 一个分支同一时间只能被一个 worktree 检出,避免冲突
  • 建议 worktree 放在主仓库同级或父级目录,便于管理
  • 用完即删,避免积累过多 worktree 导致混乱
  • VSCode、JetBrains 系列都可以直接打开 worktree 目录作为独立项目

八、总结

核心记忆点:

  • 新增用 add,删除用 remove,清理用 prune
  • 不要直接删文件夹 —— 用 remove 更干净
  • 删除 worktree 不会删除分支,分支依然存在于主仓库中
  • 一个分支同时只能被一个 worktree 检出

Worktree 特别适合多任务并行的开发场景,尤其当你的项目编译或启动耗时较长时。结合 Git 的 bisectsubmodule 等功能,worktree 能大幅提升调试效率。

如果团队中有成员还不了解这个功能,建议分享给他们 —— 早用早享受。


你的开发效率,从放弃频繁 git checkout 开始。

如果你有其他关于 Git Worktree 的问题或使用心得,欢迎在评论区交流讨论。

Read more

【避坑指南】从 TinyDB 文件损坏,聊聊文件截断与磁盘刷盘的底层原理

【避坑指南】从 TinyDB 文件损坏,聊聊文件截断与磁盘刷盘的底层原理

在 Python 轻量级开发中,TinyDB 因其“零部署、文件即数据库、支持对象化查询”的特性,成为了存储配置信息、多租户元数据的神器。 但在高频写入或异常崩溃的场景下,你是否遇到过这样的诡异现象:导出的 JSON 文件末尾莫名其妙多出了几个 NULNUL(\x00)空字节,导致整个数据库报 JSON 无法解析的错误? 本文将带你还原这个经典的“文件空洞”Bug,并分享如何通过自定义存储类 MyJSONStorage 彻底解决它。 一、 现象还原:消失的尾巴与诡异的 NUL 在默认情况下,TinyDB 的 JSONStorage 是这样写入文件的: 1. seek(0) 指针回到文件开头。 2. write(json_data) 写入序列化后的 JSON 字符串。 3. truncate(

By 樊泽豪
搭建K3s集群

搭建K3s集群

K8s环境部署 简介 搭建 K3s + Rancher + Longhorn + MetalLB环境 K3s K3s是一款轻量级Kubernetes发行版,其核心优势在于: * 极致轻量:单个二进制文件不到100MB,仅需512MB内存即可运行,启动和资源消耗远低于标准集群。 * 功能齐全:通过CNCF认证,100%兼容标准Kubernetes API,并内置了常用组件,开箱即用。 * 灵活的数据存储:可以使用外部数据库(mariadb)替代etcd,降低初始资源。 Rancher Rancher是一个开源容器管理平台,核心能力包括: * 统一纳管:可集中管理任意K8s集群(包括K3s/RKE2、云厂商托管集群及已有集群)。 * 降低门槛:提供直观图形界面及开箱即用的CI/CD、监控、服务网格等工具链。 * 安全合规:支持AD/LDAP对接及精细化RBAC,实现跨集群统一安全策略。 Longhorn Longhorn 是一款专为 Kubernetes 设计的轻量级、可靠且易用的分布式块存储系统,它通过容器和微服务将现有存储资源转化为持久卷,

By 樊泽豪
Docker常用操作

Docker常用操作

安装 Windows安装Docker到F盘(非系统盘) Start-Process -FilePath 'Docker_Desktop_Installer.exe' -Wait -ArgumentList "install --installation-dir=F:\DockerDesktop" 改变容器、镜像文件位置 以管理员权限启动Docker Desktop,Settings-Resources-Disk iamge location 配置dockerhub国内源 阿里云:容器镜像服务 (aliyun.com) 其他源 more /etc/docker/daemon.json 输入以下文件: { "registry-mirrors": [ "https://kk8u6omk.mirror.aliyuncs.com", "https:

By 樊泽豪
如何在 Ghost 博客中添加类似 Word 的左侧固定目录(纯干货)

如何在 Ghost 博客中添加类似 Word 的左侧固定目录(纯干货)

当我们在 Ghost 博客中撰写长文时,一个类似 Word 导航窗格的目录能极大提升读者的阅读体验。本文将分享如何通过 Code Injection(代码注入) 快速实现一个完全静止、不随点击乱跳、长标题自动换行的优雅左侧悬浮目录。 实现效果 * 完全固定: 目录稳居文章左侧,只有正文跟随鼠标滚动。 * 绝对静止: 修复了常见插件点击目录项时,目录自身会产生二次跳动的痛点。 * 清晰完整: 长标题自动换行显示,绝不裁剪文字。 * 移动端友好: 在手机或平板等小屏幕上自动隐藏,防止遮挡正文。 部署步骤 无需修改任何主题源文件,只需登录 Ghost 后台,进入 Settings -> Code Injection(代码注入),将以下两段代码全选覆盖粘贴即可。 1. 注入到 【Site Header】 在 Site Header 框中复制并完全粘贴以下代码(包含 Tocbot 官方样式与自定义微调

By 樊泽豪