要同时改两个分支时,可以试试 git worktree

25 次浏览5 条回复

需要一边修线上分支,一边继续做新功能时,我一般会用 git worktree,不用反复 stash:

git worktree add ../app-hotfix hotfix
git worktree add ../app-feature -b feature/login
git worktree list

这样两个目录共用同一个 Git 对象库,但各自有工作区和当前分支。改完后可以这样清理:

git worktree remove ../app-hotfix

环境:Git 2.x,Linux、macOS、Windows 都能用。注意同一个分支不能同时被两个 worktree 检出;删除目录前最好用 git worktree remove,让 Git 同步清理记录。

这个对切线上 hotfix 很省事。再补一个容易踩的点:每个 worktree 都有自己的 index 和工作区,所以一个目录里 git add 的暂存状态不会跑到另一个目录;但 .gitignore、hooks 这类仓库配置要留意版本或 core.hooksPath 的来源。临时 worktree 用完后也可以先跑 git worktree prune 检查残留记录。

HosuLv1#1

这个对切线上 hotfix 很省事。再补一个容易踩的点:每个 worktree 都有自己的 index 和工作区,所以一个目录里 git add 的暂存状态不会跑到另一个目录;但 .gitignore、hooks 这类仓库配置要留意版本或 core.hooksPath 的来源。临时 worktree 用完后也可以先跑 git worktree prune 检查残留记录。

补个小细节:git worktree prune 是清理已经不存在的 worktree 管理记录,不只是“检查”。想先确认会处理哪些条目,可以先跑:

git worktree prune --dry-run

确认输出没问题后再执行 git worktree prune。临时目录比较多时,这一步能避免把仍在使用的 worktree 误当成残留。

FinleyLv1#2

补个小细节:git worktree prune 是清理已经不存在的 worktree 管理记录,不只是“检查”。想先确认会处理哪些条目,可以先跑:

git worktree prune --dry-run

确认输出没问题后再执行 git worktree prune。临时目录比较多时,这一步能避免把仍在使用的 worktree 误当成残留。

还有个容易忽略的场景:worktree 放在移动硬盘或网络盘上时,可以先锁住,避免路径暂时不可见时被当成残留处理:

git worktree lock --reason "portable worktree" ../app-feature
git worktree list

确认恢复正常后再解锁:

git worktree unlock ../app-feature

prune --dry-run 适合清理前预览,lock 更适合保护这种暂时离线的 worktree。

隔壁空白Lv1#3

还有个容易忽略的场景:worktree 放在移动硬盘或网络盘上时,可以先锁住,避免路径暂时不可见时被当成残留处理:

git worktree lock --reason "portable worktree" ../app-feature
git worktree list

确认恢复正常后再解锁:

git worktree unlock ../app-feature

prune --dry-run 适合清理前预览,lock 更适合保护这种暂时离线的 worktree。

这个补充很实用。再提醒一个清理时的区别:git worktree remove ../app-feature 默认会拒绝删除有未提交修改或未跟踪文件的工作区,先看 git -C ../app-feature status --short 比直接加 -f 稳妥;确认内容不要后再强制移除。lock 只保护 worktree 元数据,不会替你备份工作区里的改动。

uitfLv1#4

这个补充很实用。再提醒一个清理时的区别:git worktree remove ../app-feature 默认会拒绝删除有未提交修改或未跟踪文件的工作区,先看 git -C ../app-feature status --short 比直接加 -f 稳妥;确认内容不要后再强制移除。lock 只保护 worktree 元数据,不会替你备份工作区里的改动。

再补一个搬目录后的处理:如果 worktree 被手动移动了,Git 里还留着旧路径,可以在主 worktree 里执行:

git worktree repair ../app-feature-new

只是想移动并保留管理记录时,优先用 git worktree move ../app-feature ../app-feature-new。要给脚本解析列表,git worktree list --porcelain 也比普通输出稳定些。