首页/开发/Git 与协作速查/工作区的清理与迁移
进阶与大仓实践69 条

工作区的清理与迁移

删除工作区用 remove(--force 处理有改动的目录);需要迁移位置时先 remove 再重新 add,避免留下失效引用。

Git 与协作速查开发更新于 2026-10-13

worktree remove 是什么

git worktree remove 删除一个关联工作区:清掉工作区目录,并同步移除 .git/worktrees 下的登记信息,一步到位。直接手工删目录会留下「已登记但目录缺失」的失效状态,git worktree list 会显示 prunable,之后对同名路径再执行 add 会被拒绝;remove 从根上没有这类残留。工作区要换位置时,标准做法是先 remove 再在新路径 add,而不是搬动目录。

基本信息

语法git worktree remove [-f] <路径>(remove 自 Git 2.17 起提供)
前提目标工作区没有未提交改动,否则直接拒绝
强制-f / --force 丢弃改动后删除
锁保护被 lock 的工作区需要 remove -f -f 或先 unlock
配套清理git worktree prune 清掉目录已消失的失效登记
核对git worktree list 查看工作区及 locked / prunable 标记

典型使用场景

  • 热修复收尾:hotfix 工作区合并完成后删除,回到单工作区状态
  • 临时任务清理:为评审或演示开的工作区用完即删,避免长期堆积
  • 磁盘吃紧:批量检查旧工作区后删除不再需要的那些
  • 流水线收尾:CI 脚本在任务结束时 remove 自建工作区,防止残留
  • 事故修复:目录被误删后先 prune 清登记,同名路径才能重新 add
  • 位置调整:工作区要挪到别的盘或目录时,remove 后在新位置 add

常用示例

常用示例
git worktree list                        # 列出全部工作区,注意 locked / prunable 标记
git -C ../hotfix status --short          # 删除前确认没有未提交改动
git worktree remove ../hotfix            # 常规删除:目录与登记信息一起清理
git worktree remove --force ../hotfix    # 有未提交改动时强制删除(改动会被丢弃)
git worktree unlock ../hotfix            # 被锁定的工作区先解锁(或 remove -f -f 强删)
git worktree prune                       # 目录已被手工删除时,清理失效登记
git worktree add ../hotfix-new hotfix    # 换位置:先删再在新路径重建

常见情况与处理

情况处理说明
有未提交改动先提交或 --force报错 contains modified or untracked files
工作区被 lockunlock 或 remove -f -f单次 -f 不足以删除被锁工作区
目录已手工删除git worktree prunelist 中显示 prunable 标记
同名路径要重新 addprune 或 add -f提示 missing but already registered
主工作区不能删除报 is a main working tree,remove 只针对关联工作区
--force 会丢弃工作区里的未提交改动,执行前先用 git -C <路径> status 确认;改动有保留价值就先 commit 或 stash,再删除。
删除工作区不会删除分支:分支仍指向原来的提交,需要清理时用 git branch -d 单独处理,别以为删了工作区分支就没了。
旧版本兼容:Git 2.17 之前没有 remove 子命令,只能手工删目录再 prune,为老环境写的脚本要留兼容分支。

易错点

  • 直接 rm -rf 不清理元数据:list 显示 prunable,同名路径 add 报 missing but already registered,正确做法是 remove 或 prune
  • 目录被进程占用删除失败:编辑器、终端或 CI 进程占着目录时 remove 报错,先关掉相关进程
  • --force 的代价:没有提交的改动永久丢失,删前用 status 核对或 stash 兜底
  • 锁保护并非万能:被 lock 后单次 -f 会被拒绝,但 remove -f -f 仍可强删,重要工作区要靠流程管理而不只是 lock
  • 误以为分支随之清理:删除工作区后分支与远程跟踪引用都还在,残留分支需人工处理

数据来源与参考

  • Git 官方文档:git-worktree(remove/prune)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌