团队的一个痛点:在maint版本和feature版本交集阶段,在feature版本分支开发新特性过程中,当有maint版本的Bug时,需要切换到maint版本分支修复Bug——由于2个版本分支的工程依赖环境差异较大,导致每次切换分支后,工程都都需要重新安装依赖以及做全量编译——这无疑增加了编译时间,导致开发效率下降。
针对这个痛点,目前发现 git worktree 这个方案有助解决。
git worktree方案可以概括为:通过创建共享版本仓库的多个工作区,实现多分支并行开发,从而实现多个工程环境的缓存,达到提升开发效率的目的。具体地:
- 可为一个分支创建一个工作区
- 每个工作区的工程环境独立运行
- 每个工作区共享同一个版本仓库信息
相比通过git clone方式创建多个独立工程环境的工作区,git worktree的优点在于:
-
更节省硬盘空间
git clone方式下,每个工作区都有一个版本仓库
git worktree方式下,每个工作区共享同一个版本仓库,节省了n-1/n(n为工作区数量)的硬盘空间 -
各个工作区之间的更新同步更快
git clone方式下,A工作区和B工作区同步更新的路径:A工作区commit - A工作区push - B工作区pull
git worktree方式下,A工作区只要本地提交更新后,其他工作区就能立即收到(因为它们共享同一个版本仓库)
git worktree的使用示例如下:
- 为maint_branch分支创建一个工作区maint_branch_worktree
# maint_proj 工程目录
cd path/to/maint_proj
# 创建工作区
git worktree add ../maint_worktree maint_branch
如果需要拉取一个不存在的分支,可加-b参数,在拉取worktree的同时创建新分支
git worktree add ../new-dir -b a-not-existing-branch
- 进入工作区maint_worktree上完成修复Bug工作
# ios 工程目录
cd path/to/maint_worktree
# fix your bug
- 在工作区maint_worktree上完成修复Bug工作后,清理工作区maint_worktree
# maint_proj 工程目录
cd path/to/maint_proj
# 删除 maint_worktree 文件夹
rm -rf ../maint_worktree
# 清理工作区信息
git worktree prune
worktree指令汇总:
# 添加worktree
git worktree add [-f] [--checkout -b <new-branch>] <path> <commit-ish>
# 列出所有worktree
git worktree list [--porcelain]
# worktree上锁
git worktree lock [--reason <string> <worktree>]
# worktree解锁
git worktree unlock <worktree>
# 移动worktree到其他目录
git worktree move <worktree> <new-path>
# 清除那些检出目录已经被删除的worktree
git worktree prune -n --expire <expire>
# 删除worktree, 同时删除检出目录
git worktree remove -f <worktree>