作为程序员的我们应该都有一个感受,一旦进入某个项目,从开发,到发布生产,到 hotfix,到后期维护,那基本都有你的份,正在开发某个 feature,老板突然跳出来说让你做生产商的 hotfix 更是家常便饭,面对这种情况,使用 Git 的我们通常有两种解决方案:
- 草草提交未完成的 feature,然后切换分支到 hotfix
- git stash | git stash pop 暂存工作内容,然后再切换到 hotfix
第二种方式较第一种还好很多,可是面对下面这些场景,stash 依旧不是很好的解决方案
我们面对的场景
- 正在 main 分支上跑很长时间的测试,切换到 hotfix 或 feature, 测试就会中断
- 项目非常大,频繁地切换索引,成本非常高
- 在几年前 release 的旧版本,设置和当前不一样,IDE restructure 适配切换也会带来很大的开销
- 切换分支,需要重新设置相应的环境变量,比如 dev/qa/prod
- 需要切换到同事的代码,帮助调试代码复现问题
有的同学想到,git clone 多个 repo 不就可以了吗?这是解决上述问题的一个方法,但背后同样隐藏着很多问题:
- 多个 repo 的状态是不好同步的,比如没办法快速 cherry-pick, 一个 repo checkout 的分支,另外一个 repo 需要重新 checkout
- git history/log 是重复的,当项目历史非常长,.git 文件夹下的内容是非常占用磁盘空间的
- 同一个项目,多个 repo,不易管理
那如何做才能满足这些特殊场景,又不出现上述这些问题呢?
git-worktree
其实,这是 Git 2015 年前就开始支持的功能,却很少有人知道它,git-worktree 的使用非常方便,在终端输入:
git worktree --help
就