ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Git Worktree 详解

Git Worktree 详解 Git Worktree 详解Git worktree工作树允许你在同一份仓库中同时检出多个分支到不同的目录无需反复切换分支或克隆多份仓库。这是处理并行任务多分支开发、热修复、代码评审的利器。为什么需要 worktree普通 Git 工作流的痛点切换分支成本高git checkout会暂停当前工作未提交的修改会阻塞切换或带来冲突。并行需求冲突想在 A 分支写功能又想马上切到 B 分支修 bug如果依赖未提交内容就会互相干扰。克隆多份仓库占用空间大git clone会把整个.git历史复制多份磁盘和索引损耗都很大。worktree 的解决方案共享同一份仓库历史同一个.git目录但每个 worktree 有独立的工作目录 暂存区 HEAD。你可以同时打开多个目录分别处于不同分支互不阻塞。核心概念main worktree主工作树默认的一棵工作树通常对应仓库根目录。linked worktree链接工作树通过git worktree add额外检出的工作树位于其他目录。.git目录共享所有 worktree 共享同一份对象库objects、引用refs、配置config因此切换成本极低。目录结构说明project/ ├── .git/ # 共享对象库、refs、config整个仓库唯一的 .git ├── index.html # main worktree主工作树 / 当前分支 └── _feature/ # linked worktree另一个分支 ├── .git # 这是一个文件内容指向共享 .git 目录 └── index.html # feature 分支的文件链接 worktree 里的.git不是目录而是一个文本文件内容形如gitdir: /path/to/project/.git/worktrees/_feature这就是所有 worktree 共享同一份历史的关键。常用命令速查操作命令查看所有 worktreegit worktree list新建 worktree新分支git worktree add 目录 -b 新分支名 [基点]新建 worktree检出已存在分支git worktree add 目录 已存在分支基于某个 commit/tag 创建git worktree add 目录 commit/tag从临时分支创建git worktree add --detach 目录 commit移动 worktreegit worktree move 旧目录 新目录锁定 worktreegit worktree lock 目录解锁 worktreegit worktree unlock 目录清理已删除分支的 worktree 记录git worktree prune删除 worktreegit worktree remove 目录经典使用场景1. 并行多分支开发# 在 main 工作树基于 master 开一个功能分支的工作树 git worktree add ../project-feature -b feature/new-ui # 在另一个目录并行做热修复 git worktree add ../project-hotfix -b hotfix/login-bug # 三个目录互不干扰都指向同一个仓库 git worktree list2. 边开发边代码评审# 检出同事的 PR 分支不影响你当前正在写的代码 git worktree add ../review -b review/branch-name origin/pr-branch3. 快速尝试验证某个版本# 临时查看某个 tag/commit不想动当前分支 git worktree add --detach ../tmp-v2.0 v2.0 # 用完即删 git worktree remove ../tmp-v2.0使用注意事项一个分支只能有一个 worktree同一分支在同一仓库中只能被一个 worktree 检出。若已有一棵 worktree 在feature/x上再git worktree add ../t2 feature/x会报错fatal: feature/x is already checked out at ...这是为了确保对一个分支的提交方向是唯一的。删除前先检查是否干净git worktree remove默认拒绝删除有未提交改动或未跟踪文件的 worktree需先清理或加--force谨慎。分支删除后残留的记录分支被删除后其 worktree 相关记录仍存在。定期执行git worktree prune清理。暂存区相对独立每个 worktree 有独立的暂存区index。在 A worktree 暂存的改动不会出现在 B worktree。完整练习从 0 上手# 1. 创建演示仓库 mkdir demo-worktree cd demo-worktree git init -b main echo hello README.md git add . git commit -m init # 2. 查看当前 worktree只有 main git worktree list # demo-worktree hash [main] # 3. 创建功能分支的 worktree git worktree add ../demo-wt-feature -b feature/hello # 4. 进入新 worktree 写代码 cd ../demo-wt-feature echo world README.md git commit -am update from feature worktree # 5. 回到主 worktreemain 分支完全没受影响 cd ../demo-worktree git log --oneline # 仍只有 init # 6. 删除 worktree 并清理 cd .. git worktree remove --force ../demo-wt-feature git branch -d feature/hello git -C demo-worktree worktree prune高级技巧给 worktree 配置不同远程可以将不同 worktree 指向不同远程便于发布/测试git worktree add ../prod -b release/prod git -C ../prod remote add prod gitexample.com:prod-repo.git git -C ../prod fetch prod用 shell 别名加速# ~/.bashrc 或 ~/.zshrc alias wt-addgit worktree add alias wt-listgit worktree list alias wt-rmgit worktree remove alias wt-prunegit worktree prune在 worktree 间跳转# 列出后用 -C 直接到对应目录执行 git git worktree list git -C ../project-feature status常见问题FAQQworktree 会重复占用磁盘空间吗A不会重复保存历史对象。所有 worktree 共享同一.git对象库只额外占一份工作目录 暂存区的空间。Q可以嵌套多个 worktree 吗A可以git worktree add可重复创建任意多棵只要目录不冲突、分支不重复检出。Qworktree 里的分支能 push 吗A能它就是一份正常的 Git 检出push/pull/fetch 都照常工作。Q误删了 worktree还能找回吗A分支和提交仍保留在仓库历史里可用git branch重建分支后重新git worktree add检出。Q不同 worktree 之间能合并吗A能本质是不同分支在该仓库任意 worktree 中git merge或git rebase即可。总结场景是否建议用 worktree替代方案并行开发多个功能✅ 强烈推荐多份 clone费空间频繁切换分支写代码✅ 推荐git stash checkout边写边评审他人 PR✅ 推荐切分支 / stash只是想看旧版本✅ 适合git show一次性实验一般临时 clone / stash一句话记忆git worktree用「一份历史、多份工作目录」解决「多任务并行」。
返回列表