参数细节
-f,--force默认情况下,add拒绝在另一个工作树已经检出<branch>时创建新的工作树。此选项覆盖了这一保护机制。-b <new-branch>-B <new-branch>使用add创建一个名为<new-branch>的新分支,从<branch>开始,并在新工作树中检出<new-branch>。如果未指定<branch>,则默认为HEAD。默认情况下,-b拒绝创建已存在的分支。-B覆盖这一保护机制,将<new-branch>重置为<branch>。--detach在新工作树中分离HEAD。--[no-]checkout默认情况下,add检出<branch>,但可以通过--no-checkout禁用检出,以便进行自定义操作,例如配置稀疏检出。-n,--dry-run使用prune时,不实际删除任何内容,仅报告将要删除的内容。--porcelain使用list时,以易于解析的格式输出,适合脚本使用。此格式在不同 Git 版本和用户配置下保持稳定。-v,--verbose使用prune时,报告所有删除操作。--expire <time>使用prune时,仅过期超过<time>指定时间未使用的挂起工作树。
44.1 使用工作树
假设你正在开发新功能,老板突然要求你立即修复一个问题。此时,你的工作树可能处于混乱状态(有新增、移动和删除的文件等),你不想干扰正在进行的工作。 通过添加一个工作树,你可以创建一个临时的链接工作树来紧急修复问题,修复完成后删除该工作树,然后继续之前的工作:
$ git worktree add -b emergency-fix ../temp master
$ pushd ../temp
# ... 修复问题 ...
$ git commit -a -m 'emergency fix for boss'
$ popd
$ rm -rf ../temp
$ git worktree prune
注意:在这个示例中,修复后的代码仍在 emergency-fix 分支中。此时,你可能需要使用 git merge 或 git format-patch,然后删除 emergency-fix 分支。
44.2 移动工作树
截至版本 2.11.0,Git 尚未提供移动现有工作树的内置功能,这被列为官方 Bug。
要绕过这一限制,可以通过直接操作 .git 引用文件来手动完成。以下是一个示例: 假设主仓库位于 /home/user/project-main,次要工作树位于 /home/user/project-1,你想将其移动到 /home/user/project-2。
在这些步骤之间不要执行任何 Git 命令,否则垃圾收集器可能会被触发,导致对次要工作树的引用丢失。从开始到结束连续执行以下步骤:
修改工作树的 .git 文件,使其指向主树中的新位置。
文件 /home/user/project-1/.git 应包含以下内容:
gitdir: /home/user/project-main/.git/worktrees/project-2
在主项目的 .git 目录中重命名工作树,移动工作树目录:
$ mv /home/user/project-main/.git/worktrees/project-1 /home/user/project-main/.git/worktrees/project-2
修改 /home/user/project-main/.git/worktrees/project-2/gitdir 文件,使其指向新位置。
例如,文件应包含以下内容:
/home/user/project-2/.git
最后,将工作树移动到新位置:
$ mv /home/user/project-1 /home/user/project-2
如果操作正确,列出现有工作树时应显示新位置:
$ git worktree list
/home/user/project-main 23f78ad [master]
/home/user/project-2 78ac3f3 [branch-name]
现在也可以安全地运行 git worktree prune。