git worktree用法介绍
本文发布时间较早,文中提及的技术方案与接口可能已经过时,请注意甄别参考。
今天君哥让我同步下代码,需要把分支切换到主分支并拉取最新代码,但是我本地的开发分支还在跑开发任务,这个任务耗时又比较长,我就让他等等,他说可以用 git 的 worktree 功能,第一次听到这个词有点新鲜,就去了解了下,发现非常好用,特别适合一边开发新功能,一边改紧急问题的场景啊,这里介绍给大家,哈哈哈。
简单介绍
Git worktree 的功能就是在一个本地的 Git 仓库,同时开出多个独立工作目录,不用多次克隆仓库,各分支并行开发互不干扰。
适用场景:
1、一边进行开发,一边紧急修 Bug,不用反复切换分支、暂存工作区文件。
2、同时查看、对比多个分支代码。
3、并行打包、多环境编译。
底层原理:共用同一个 .git 仓库数据库,每个 worktree 只存单独工作区 + 索引,省磁盘空间。
核心命令
创建新工作树
# 基础语法
git worktree add [-b <新分支名>] <目标目录> <分支/提交哈希>
# 示例1: 绑定已有分支 main,新建目录 ./main-wt
git worktree add ./main-wt main
# 示例2: 新建分支 feature-xxx,创建对应工作目录
git worktree add -b feature-0711 ./feature-0711 main
# 示例3: 直接绑定某个 commit 只读查看
git worktree add ./temp-wt a9f23bc查看所有工作树
git worktree list
# 输出示例
/frontend cba8c43 [feat/xxx]
/frontend/main-wt f5748a5 [main]删除工作树
两步:删文件夹 + 清理 git 记录
# 方式1: 自动清理(推荐)
git worktree remove ./main-wt
# 方式2: 手动删文件夹后清理残留记录
rm -rf ./main-wt
git worktree pruneprune 作用:清理已手动删除、但 git 仍有记录的实效的 worktree。
锁定 / 解锁工作树(防止误删)
# 锁定
git worktree lock ./main-wt --reason="线上打包目录,勿删"
# 解锁
git worktree unlock ./main-wt在 worktree 中创建新分支
直接进入对应目录操作,和普通仓库完全一致
cd ./main-wt
git checkout -b feature-new常用实操流程
场景:正在开发 feature,临时切 bug 修复
# 主仓库在 ./frontend,当前在feature分支
# 1. 新建hotfix工作树,基于main分支
git worktree add ../frontend-hotfix main -b hotfix-xxx
# 2. hotfix目录改bug
cd ../frontend-hotfix
# 提交推送bug修复
git add .
git commit -m "fix: 修复xxx"
git push origin hotfix-xxx
# 3. bug处理完,删除worktree
cd ../frontend
git worktree remove ../frontend-hotfix限制与注意事项
1、同一分支不能绑定多个 worktree
报错:fatal: 'xxx' is already checked out at ...
解决方案:不同 worktree 使用不同分支。
2、共享远程配置、tag、提交历史,互不冲突;但工作区完全隔离。
3、不能在 worktree 内部再执行 git clone 套仓库,容易错乱。
4、删除文件夹后必须 git worktree prune ,否则 list 里会残留失效记录。
5、裸仓库(--bare)不支持 worktree
怎么样,学到了吗?提高工作效率的一个小窍门~
若有共鸣,不妨点个喜欢
本文地址:https://www.mingsixue.com/blog/detail/git-worktree-use-introduce
文章若需转载,请附上原文链接,谢谢配合。^_^