为什么需要 git worktree
举个现实的例子:
假设你是一名前端开发者,正在用 Vue CLI 开发新功能。突然线上出了问题,你不得不暂停当前工作,使用 git stash
暂存代码,再切换到其他分支去处理问题。忙完线上修复后,你再恢复代码、重启 Vue CLI,却发现开发思路已经被打断。
或者,你可能曾考虑在电脑上克隆多个仓库以便并行开发。但这样一来,每个仓库都是独立的副本,无法直接互通。为了同步代码,你可能需要先将代码推送到远程,再从其他仓库拉取更新。更别提 git stash
的内容还得经过 commit
、push
、pull
等一系列操作,既麻烦又低效。
有没有更好的解决方案?
答案是肯定的:Git Worktree
就是为了解决这些问题而生的。
值得一提的是,Python 语言的发明者 Guido van Rossum 也曾在 2021 年表示,他之前并不知道 Git Worktree 的存在,并对这一功能表示了赞赏:
官方文档: https://git-scm.com/docs/git-worktree/zh_HANS-CN
Git Worktree
是 Git 2.5 版本后新增的功能,它允许你在同一仓库内创建多个工作树,每个工作树都可以检出不同的分支。这些工作树共享同一个 .git
目录(即对象数据库),避免了重复存储相同的 Git 对象(如提交、树、对象等),因为新仓库的 .git
目录实际上只是一个指向主仓库 .git
的文件。
这样,你就可以在不同的分支和文件夹中并行工作,彻底告别频繁切换分支的烦恼。并且,基于已有的 .git
数据创建新工作目录,不仅节省了时间和磁盘空间,分支切换和代码拉取也更加迅速。
git worktree 怎么用
1. 创建新的工作树
git worktree add <路径> <分支>
- 创建一个新的工作树并将指定分支检出到该工作树中。例如:
git worktree add ../my-feature-branch feature-branch
- 这会在当前仓库目录外的
../my-feature-branch
目录中创建一个新的工作树,并将feature-branch
分支检出。
2. 移除工作树
git worktree remove <路径>
- 移除指定路径的工作树。例如:
git worktree remove ../my-feature-branch
- 这会删除
../my-feature-branch
工作树,注意工作树内的修改不会丢失,仓库本身的数据不会受影响。
3. 列出所有工作树
git worktree list
- 显示当前仓库的所有工作树及其状态。
4. 清理孤立的工作树
git worktree prune
- 删除所有已被移除的工作树,清理磁盘空间。
5. 查看当前的工作树状态
git worktree status
- 显示当前工作树的状态,查看各工作树的当前分支、文件状态等。
在 VSCode 上图形化操作
尽管命令行操作已经很直观,但对于许多开发者来说,图形化界面更易上手。尤其是在 VSCode 中,你可能更希望能方便地搜索和切换不同的工作目录,而不必记住一长串命令。
为此,我开发了一个 VSCode 插件,经过一年多的迭代和 GitHub Issue 的建议改进,现已经成熟稳定,即装即用,所有操作一目了然。
请放心使用 。
示例操作
- 创建工作树
- 添加文件夹到工作区
总结
Git Worktree 摆脱了频繁切换分支和重复克隆仓库的烦恼,让你在同一仓库内轻松管理多个工作树。无论通过命令行还是 VSCode 插件,都能大幅提升开发效率,让工作流程更顺畅。