手上的改动还没做完,又要去另一个分支修个小问题:以前要么先 stash、切分支,要么再克隆一份仓库。git worktree 让同一个仓库同时有好几个工作目录,每个目录检出不同的分支,共用一份提交历史。
常用的几条命令
# 在旁边新建一个目录,同时新建分支 fix/typo 并检出到那里
git worktree add ../proj-fix -b fix/typo
# 看看现在有哪些工作目录
git worktree list
# 用完删掉(目录里不能有没提交的改动)
git worktree remove ../proj-fix
# 手动删了目录之后,清理残留的记录
git worktree prune
需要知道的几点
- 同一个分支同一时间只能在一个工作目录里检出。想在两个目录里看同一个分支,git 会拒绝。
- 每个工作目录有自己的暂存区和 HEAD,互不干扰;但提交、分支、标签都是共用的,在一个目录里提交,另一个目录马上就能看到。
- stash 是整个仓库共用的。在 A 目录 stash 的东西,在 B 目录用
git stash pop也会被弹出来。几个目录同时在用时,给 stash 加上说明(git stash push -m "说明"),恢复时用git stash apply指定那一条,别直接 pop。
我现在的习惯:长期在做的功能各占一个工作目录,临时的小修就开一个用完即删的目录,主目录保持干净。