# git-worktree > 原文: [https://git-scm.com/docs/git-worktree](https://git-scm.com/docs/git-worktree) ## 名称 git-worktree - 管理多个工作树 ## 概要 ``` git worktree add [-f] [--detach] [--checkout] [--lock] [-b ] [] git worktree list [--porcelain] git worktree lock [--reason ] git worktree move git worktree prune [-n] [-v] [--expire ] git worktree remove [-f] git worktree unlock ``` ## 描述 管理连接到同一存储库的多个工作树。 git存储库可以支持多个工作树,允许您一次签出多个分支。使用`git worktree add`,新的工作树与存储库相关联。这个新的工作树称为“链接工作树”,而不是“git init”或“git clone”编写的“主工作树”。存储库有一个主要工作树(如果它不是裸存储库)和零个或多个链接工作树。完成链接的工作树后,使用`git worktree remove`将其删除。 如果在不使用`git worktree remove`的情况下删除工作树,则其关联的管理文件(位于下面的“详细信息”)最终将自动删除(请参阅 [git-config中的`gc.worktreePruneExpire` [1] ]](https://git-scm.com/docs/git-config) ),或者您可以在主要或任何链接的工作树中运行`git worktree prune`来清理任何陈旧的管理文件。 如果链接的工作树存储在并非总是挂载的便携式设备或网络共享上,则可以通过发出`git worktree lock`命令来阻止其管理文件被修剪,可选择指定`--reason`来解释工作树被锁定的原因。 ## COMMANDS ``` add [] ``` 创建`<path>`并将`<commit-ish>`签出到其中。新的工作目录链接到当前存储库,共享除工作目录特定文件(如HEAD,索引等)之外的所有内容。`-`也可以指定为`<commit-ish>`;它与`@{-1}`同义。 如果< commit-ish>是一个分支名称(称之为`<branch>`)并且未找到,并且既没有使用`-b`也没有`-B`或`--detach`,但是在一个远程中确实存在跟踪分支(称之为`<remote>`)使用匹配的名称,视为等效于: ``` $ git worktree add --track -b / ``` 如果分支存在于多个遥控器中,并且其中一个由`checkout.defaultRemote`配置变量命名,我们将使用该分支用于消除歧义,即使`<branch>`在所有遥控器中都不是唯一的。将其设置为例如如果`<branch>`不明确但存在于_原点_遥控器上,`checkout.defaultRemote=origin`总是从那里检出远程分支。另见 [git-config [1]](https://git-scm.com/docs/git-config) 中的`checkout.defaultRemote`。 如果省略`<commit-ish>`并且既不使用`-b`也不使用`-B`和`--detach`,那么为方便起见,新工作树与以`$(basename <path>)`命名的分支(称为`<branch>`)相关联。如果`<branch>`不存在,将自动创建基于HEAD的新分支,就像给出`-b <branch>`一样。如果`<branch>`确实存在,它将在新的工作树中检出,如果它没有在其他任何地方检出,否则命令将拒绝创建工作树(除非使用`--force`)。 ``` list ``` 列出每个工作树的详细信息。首先列出主要工作树,然后列出每个链接的工作树。输出详细信息包括工作树是否裸露,当前检出的修订版,以及当前检出的分支(或者_分离HEAD_ ,如果没有)。 ``` lock ``` 如果工作树位于未始终安装的便携式设备或网络共享上,请将其锁定以防止其管理文件被自动修剪。这也可以防止它被移动或删除。 (可选)使用`--reason`指定锁定的原因。 ``` move ``` 将工作树移动到新位置。请注意,无法移动主工作树或包含子模块的链接工作树。 ``` prune ``` 修剪$ GIT_DIR / worktrees中的工作树信息。 ``` remove ``` 删除一个工作树。只能删除干净的工作树(没有未跟踪的文件,也不会删除跟踪文件中的修改)。可以使用`--force`删除不干净的工作树或带子模块的工作树。无法删除主工作树。 ``` unlock ``` 解锁工作树,允许对其进行修剪,移动或删除。 ## OPTIONS ``` -f ``` ``` --force ``` 默认情况下,`add`拒绝创建新的工作树,当`<commit-ish>`是分支名称并且已经被另一个工作树检出,或者`<path>`已经分配给某个工作树但是丢失了(例如,如果`<path>`被手动删除)。此选项会覆盖这些安全措施。要添加缺失但已锁定的工作树路径,请指定`--force`两次。 `move`拒绝移动锁定的工作树,除非指定了两次`--force`。 `remove`拒绝删除不干净的工作树,除非使用`--force`。要删除锁定的工作树,请指定`--force`两次。 ``` -b ``` ``` -B ``` 使用`add`,从`<commit-ish>`开始创建一个名为`<new-branch>`的新分支,并将`<new-branch>`签出到新的工作树中。如果省略`<commit-ish>`,则默认为HEAD。默认情况下,`-b`拒绝创建新分支(如果已存在)。 `-B`会覆盖此保护措施,将`<new-branch>`重置为`<commit-ish>`。 ``` --detach ``` 使用`add`,在新工作树中分离HEAD。请参见 [git-checkout [1]](https://git-scm.com/docs/git-checkout) 中的“DETACHED HEAD”。 ``` --[no-]checkout ``` 默认情况下,`add`检出`<commit-ish>`,但是,`--no-checkout`可用于抑制检出以进行自定义,例如配置稀疏检出。请参见 [git-read-tree [1]](https://git-scm.com/docs/git-read-tree) 中的“稀疏检出”。 ``` --[no-]guess-remote ``` 使用`worktree add <path>`,不使用`<commit-ish>`,而不是从HEAD创建新分支,如果在一个与`<path>`的基本名称匹配的远程中存在跟踪分支,则将新分支基于远程跟踪分支,并标记远程跟踪分支作为新分支的“上游”。 也可以使用`worktree.guessRemote`配置选项将其设置为默认行为。 ``` --[no-]track ``` 创建新分支时,如果`<commit-ish>`是分支,则将其标记为新分支的“上游”。如果`<commit-ish>`是远程跟踪分支,则这是默认值。有关详细信息,请参阅 [git-branch [1]](https://git-scm.com/docs/git-branch) 中的“--track”。 ``` --lock ``` 创建后保持工作树锁定。这相当于`git worktree add`之后的`git worktree lock`,但没有竞争条件。 ``` -n ``` ``` --dry-run ``` 使用`prune`时,不要删除任何东西;只需报告它将删除的内容。 ``` --porcelain ``` 使用`list`,以易于解析的格式输出脚本。无论用户配置如何,这种格式在Git版本中都将保持稳定。请参阅下文了解详情。 ``` -q ``` ``` --quiet ``` 使用_添加_,禁止反馈消息。 ``` -v ``` ``` --verbose ``` 使用`prune`,报告所有删除。 ``` --expire