在 macOS 上,可以通过终端使用 git worktree remove 删除已完成的关联工作树,但首先应检查其中是否包含仍需要的更改。Git 会删除干净的工作树;如果存在未提交的更改,它会停止操作,除非进行强制删除。要保留未完成的工作,请在删除目录前将其提交或暂存 (stash)。不要仅仅为了跳过 Git 的警告而添加 --force:这可能会丢弃工作树的本地文件。这些步骤适用于关联工作树,而非仓库的主工作目录。Git 工作树文档
1. 找到工作树并检查其状态
打开终端,进入主仓库或属于同一仓库的任何关联工作树。要查看所有关联的工作树路径和分支,请运行:
git worktree list
复制已完成工作树的确切路径。然后从该工作树内部检查其状态,如果路径包含空格,请加上引号:
cd "/path/to/finished-worktree"
git status --short --branch
状态输出有助于发现已修改或已暂存的受版本控制文件以及未跟踪的文件。同时在访达 (Finder) 中检查工作树,查看是否有工作流所依赖的本地文件。被 Git 忽略的文件可能不会出现在常规状态输出中。如果您不确定目录中的某些内容是否可以舍弃,请在删除前停下来,进行单独备份或保留该目录。Git 工作树与其主工作树共享仓库数据,但拥有独立的检出 (checkout) 和索引 (index);删除检出目录并非通用的备份操作。Git 工作树文档
2. 保留您想留下的更改
如果工作已准备好保留在仓库中,请在工作树所在的分支上提交它。首先检查状态和差异,然后仅暂存您打算包含的文件并进行提交:
git diff
git add path/to/file
git commit -m "Describe the finished work"
如果您的终端 shell 对其有异常处理,请移除 git commit 前不小心多打的空格;规范的形式是 git commit -m "Describe the finished work"。提交会将更改保存在 Git 历史记录中,但在删除工作树之前,请确认提交位于预期的分支上。
如果更改尚未完成,可以改为暂存 (stash) 受跟踪的修改和未跟踪的文件:
git stash push -u -m "Before removing finished worktree"
git stash list
-u 选项会包含未跟踪的文件。被忽略的文件不包含在内,因此请单独保存任何被忽略的本地配置、生成的文件或其他所需数据。在继续操作前,请确认列表中出现了新的 stash。Stash 属于仓库,您稍后可以在另一个工作树中通过 git stash apply stash@{0} 应用已保存的更改;请先确认条目编号,因为后续的 stash 可能会改变列表顺序。应用 stash 可能会产生冲突,因此在删除该 stash 之前请检查结果。Git stash 文档
3. 删除干净的工作树
在提交或暂存了所需的更改后,离开目标目录,并在同一仓库的另一个工作树中运行删除命令。请使用 git worktree list 报告的确切路径:
cd "/path/to/main-repository"
git worktree remove "/path/to/finished-worktree"
git worktree list
第二次执行列表命令有助于确认 Git 不再列出该检出目录。Git 文档指出,remove 默认仅接受干净的工作树;存在未跟踪的文件或对已跟踪文件的修改都可能会阻止删除。Git 工作树文档
如果删除操作提示工作树不干净,请不要转而使用 git worktree remove --force,除非您已确定所有剩余的本地文件都可以丢弃。请返回该工作树,检查 git status,并先保留剩余的文件或更改。特别是 stash 不包含被忽略的文件,而且子模块 (submodule) 可能有其自身的更改需要单独处理。
如果您已在访达 (Finder) 中删除了文件夹
如果您在 Git 外部删除了关联工作树目录,其管理记录可能仍会保留。在主仓库中运行 git worktree list,检查缺失的路径是否被标记为 prunable。Git 提供了 git worktree prune 来清除目录已缺失的工作树记录;它不会恢复已删除的项目文件。仅在确认目录确实已不存在且您不需要其内容后,才使用此命令。对于日后的清理,请使用 git worktree remove,以便 Git 在删除过程中同步更新工作树元数据。Git 工作树文档
一次安全的清理应当以:已完成的检出被移除、打算保留的所有更改均已提交或暂存、所需的任何被忽略本地文件均已单独保存为终结。只要无法确认剩余内容是否可以丢弃,就应保留该工作树。
参考来源
Git - git-worktree 文档 — Git
Git - git-stash 文档 — Git