Featured image of post 使用 git worktree 进行并发分支开发Featured image of post 使用 git worktree 进行并发分支开发

使用 git worktree 进行并发分支开发

了解如何使用 git worktree 管理单独目录中的多个活动分支,而无需存储切换或克隆冗余存储库。

介绍

在日常软件开发中,在为功能分支编写代码时经常会被紧急修复请求打断。

传统上,开发人员通过以下两种方式之一处理此问题:

  1. 使用 git stash 暂时搁置活动更改,切换分支以修复错误,提交,切换回来,然后运行 ​​git stash pop
  2. 将存储库的完全独立的副本克隆到另一个目录中以处理修补程序。

但是,存储在恢复时存在冲突错误的风险,并且克隆同一存储库的多个副本会浪费磁盘空间并使本地提交同步变得复杂。

本机 git worktree 命令解决了这个问题。本文介绍如何使用 git worktree 同时处理多个分支,而无需上下文切换摩擦。


1.什么是git工作树?

git worktree 是一项本机 Git 功能,允许您将多个分支检出到计算机上的单独目录中,所有分支都链接到单个底层 .git 存储库

核心优势

  • **不再隐藏:**您可以按原样保留活动工作区,并通过切换到不同的文件夹直接跳至修补程序。
  • 磁盘空间节省: 由于所有目录共享一个 .git 历史缓存,因此与多次克隆存储库相比,磁盘开销最小。
  • 保留构建缓存: 单独的目录意味着编译器缓存(例如 Vite、Webpack 或 Next.js 构建输出)保持不变。您可以避免与来回切换分支相关的编译延迟。

2. 使用 git worktree 的基本步骤

让我们逐步了解如何创建和使用工作树进行并行开发。

目录布局

您的项目工作区的结构将如下所示:

/my-project/ (Primary workspace: working on your feature branch)
/my-project-hotfix/ (Linked worktree workspace: checking out the hotfix branch)

第 1 步:添加链接工作树

从主工作区目录 (/my-project/) 中,运行以下命令以在单独的文件夹中签出新分支:

# git worktree add <target-path> <branch-name>
# Use the -b flag if you need to create a new branch
git worktree add ../my-project-hotfix -b hotfix/critical-bug

这将创建一个名为 my-project-hotfix 的新同级文件夹,并检出并准备好 hotfix/critical-bug 分支。

第 2 步:切换文件夹和工作

导航到新文件夹,进行更改、提交并将其推送到远程存储库。

cd ../my-project-hotfix
# Resolve the bug
git add .
git commit -m "fix: resolve critical production bug"
git push origin hotfix/critical-bug

my-project 文件夹中未提交的更改保持不变。

第 3 步:删除工作树

一旦修补程序被推送并合并,您就可以安全地删除临时工作树。

导航回主存储库目录并运行清理命令:

cd ../my-project

# List all active worktrees
git worktree list

# Remove the linked worktree (this also deletes the physical directory)
git worktree remove ../my-project-hotfix

工作区现在干净了。


3、重要制约因素

使用 git worktree 时,请记住以下规则:

[!重要] 您无法同时检出多个活动工作树中的同一分支。

例如,如果您的主工作区签出了 main 分支,则尝试运行 git worktree add ../another-path main 将失败。此安全防护措施可防止本地历史记录中发生冲突的提交跟踪。

结论

git worktree 命令是管理并行任务的重要工具,而不会失去在代码库中的位置。

  1. 使用 git worktree add 创建一个单独的目录用于紧急任务。
  2. 使用 git worktree remove 提交更改并删除文件夹。

git worktree 合并到您的 Git 工作流程中以简化上下文切换并提高开发速度。