Git 屠龙技:不要再重复克隆仓库了,试试这个

为什么需要 git worktree

举个现实的例子:

假设你是一名前端开发者,正在用 Vue CLI 开发新功能。突然线上出了问题,你不得不暂停当前工作,使用 git stash 暂存代码,再切换到其他分支去处理问题。忙完线上修复后,你再恢复代码、重启 Vue CLI,却发现开发思路已经被打断。:man_shrugging:t2:

或者,你可能曾考虑在电脑上克隆多个仓库以便并行开发。但这样一来,每个仓库都是独立的副本,无法直接互通。为了同步代码,你可能需要先将代码推送到远程,再从其他仓库拉取更新。更别提 git stash 的内容还得经过 commitpushpull 等一系列操作,既麻烦又低效。

有没有更好的解决方案?:thinking:

答案是肯定的:Git Worktree 就是为了解决这些问题而生的:partying_face:

值得一提的是,Python 语言的发明者 Guido van Rossum 也曾在 2021 年表示,他之前并不知道 Git Worktree 的存在,并对这一功能表示了赞赏:

8f7205e841bab24bc1bf2291c165838.jpg

官方文档: 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 的建议改进,现已经成熟稳定,即装即用,所有操作一目了然。

请放心使用

Visual Studio Marketplace Installs
GitHub release
License

示例操作

  • 创建工作树

创建worktree

  • 添加文件夹到工作区

添加文件夹到工作区

总结

Git Worktree 摆脱了频繁切换分支和重复克隆仓库的烦恼,让你在同一仓库内轻松管理多个工作树。无论通过命令行还是 VSCode 插件,都能大幅提升开发效率,让工作流程更顺畅。:rocket::partying_face:

7 个赞

看起來挺有意思。

真的很有用. 实际开发确实会遇到这个问题. 我之前都是临时复制下目录.

clone两份(到不同目录)也挺好的,不用多学一个概念。更何况有些工具/IDE对这些特殊用法支持不好,容易出些奇怪的问题。

工具支持可能支持不好還好說,不用多學一個概念這個理由 :joy:

是啊,以前我也这么干过 :joy:,但后来发现 git worktree 更优雅,方便多了!