同一仓库要同时看两个分支,可以用 git worktree

68 次浏览8 条回复

不想来回切分支、又不想重复 clone 的话,可以在仓库目录执行:

git worktree add ../repo-review feature/login

这样会在上级目录创建一个工作树,直接进入 ../repo-review 就能看 feature/login。用完先确认没有未提交改动,再移除:

git worktree remove ../repo-review

环境:Git 2.5+。同一个分支不能同时挂到两个工作树;临时调试或并行看 PR 时挺省事。

这个对并行看 PR 很方便。补一个容易踩的点:如果分支还不存在,可以直接加 -b 创建:

git worktree add -b review/login ../repo-review origin/main

另外删工作树前可以先跑 git worktree list 看清路径,主工作树不能用 worktree remove 直接删。

还有个小细节:如果工作树目录是手动删掉的,仓库里可能还留着对应元数据,可以用 git worktree prune 清理已经不存在的记录。先跑 git worktree list 确认一下再清理会稳妥些。

再补一个不太常用但很实用的命令:如果工作树放在移动盘或网络挂载上,可以先锁住,避免 Git 把它当成不可用工作树清理:

git worktree lock ../repo-review --reason "移动盘上的评审工作树"

恢复可用后再 git worktree unlock ../repo-review。另外 worktree remove 遇到未提交或未跟踪文件会拒绝,别一上来加 -f,先确认目录里没有要留的东西。

Zoe_JayLv1#3

再补一个不太常用但很实用的命令:如果工作树放在移动盘或网络挂载上,可以先锁住,避免 Git 把它当成不可用工作树清理:

git worktree lock ../repo-review --reason "移动盘上的评审工作树"

恢复可用后再 git worktree unlock ../repo-review。另外 worktree remove 遇到未提交或未跟踪文件会拒绝,别一上来加 -f,先确认目录里没有要留的东西。

还有个搬目录时容易忽略的点:尽量用 Git 自己移动工作树:

git worktree move ../repo-review ../repo-review-new

如果已经手动移动了目录,可以在仓库里用 git worktree repair ../repo-review-new 修复登记信息。Git 2.17+ 支持这些命令,执行后再跑 git worktree list 确认路径。

如果只是临时检查某个历史提交,不想新建分支,也可以用分离 HEAD 的工作树:

git worktree add --detach ../repo-review <commit>

看完后照样先 git worktree list,再移除对应目录。这样不会把临时检查误记成一个需要长期维护的分支。

HosuLv1#5

如果只是临时检查某个历史提交,不想新建分支,也可以用分离 HEAD 的工作树:

git worktree add --detach ../repo-review <commit>

看完后照样先 git worktree list,再移除对应目录。这样不会把临时检查误记成一个需要长期维护的分支。

如果是脚本或 CI 要判断工作树状态,git worktree list --porcelain 比普通输出更稳,路径、HEAD 和分支都会按字段输出,解析时不容易被显示格式影响。临时目录清理前也可以先用它确认目标,避免误删别的工作树。

FinleyLv1#6

如果是脚本或 CI 要判断工作树状态,git worktree list --porcelain 比普通输出更稳,路径、HEAD 和分支都会按字段输出,解析时不容易被显示格式影响。临时目录清理前也可以先用它确认目标,避免误删别的工作树。

再补一个常见误会:链接工作树占用的分支不能在别处直接删,git branch -d 通常会提示它仍被某个 worktree 使用。先在对应工作树切走或移除,再删分支;清理已合并分支前,先用 git worktree list --porcelain 对照一下会更稳。

问问Lv1#7

再补一个常见误会:链接工作树占用的分支不能在别处直接删,git branch -d 通常会提示它仍被某个 worktree 使用。先在对应工作树切走或移除,再删分支;清理已合并分支前,先用 git worktree list --porcelain 对照一下会更稳。

这里再提醒一下:git worktree remove 只移除工作树登记和目录,不会自动删除对应的本地分支;远程分支也不会受影响。确认评审分支确实不要了,再单独处理分支清理,别把移除工作树和删分支当成同一步。