23

我曾经git worktree add创建一个新的工作树。我注意到它在 repo 中创建了一个与工作树同名的新分支。这个分支是干什么用的?

我在第二个工作树中检查了另一个预先存在的分支。我可以自由删除git worktree add创建的分支吗?

4

6 回答 6

36

当其他人回答这个问题时,我在这里放置了删除folder、删除worktree和删除的命令branch

首先,列出所有工作树以仔细检查...

$ git worktree list

然后,删除工作树的文件夹

$ rm -rf path/to/worktree

之后,删除工作树本身

$ git worktree prune

如果您有多个工作树,上述命令只会修剪其路径不再存在的工作树,所以不用担心!

最后,删除分支(与工作树相同的分支名称)

$ git branch -D <branch-name>
于 2017-11-22T20:37:38.163 回答
18

该分支是必要的,因为您不能同时在不同的工作树中签出相同的分支。

因此,如果您在添加工作树时没有指定分支,那么 git 会根据您当前的分支和工作树目录的名称自动添加一个。

你可能会问,为什么我不能让同一个分行结账两次?想想当你提交到 B 时工作树 A 会发生什么,如果它们都共享分支......工作树 A 会将 B 中的提交视为本地差异,但相反!就好像你这样做了git reset --soft HEAD^......那将是非常危险的。

顺便说一句,这与您无法推送到已签出的非裸存储库的分支的原因相同。

关于您的最后一个问题:您可以删除分支吗?当然,那个分支一点也不特别。只要未在任何地方签出,您就可以将其删除。

于 2016-09-26T18:25:14.173 回答
9

从 Git 2.17.0 开始,您可以安全地运行这个一体化命令

git worktree remove <path>
于 2018-04-19T15:26:32.540 回答
3

git worktree --help 清楚地提到了这一点,如下所示。

COMMANDS
       add <path> [<branch>]
           Create <path> and checkout <branch> into it. The new working directory is linked to the current repository, sharing everything
           except working directory specific files such as HEAD, index, etc.

           If <branch> is omitted and neither -b nor -B is used, then, as a convenience, a new branch based at HEAD is created automatically,
           as if -b $(basename <path>) was specified.

       prune
           Prune working tree information in $GIT_DIR/worktrees.
于 2016-09-26T18:09:48.677 回答
3

git worktree如果没有指定,将添加一个新分支:

如果<commit-ish>省略并且既不也不-b使用,则为方便起见,将自动创建一个基于 HEAD 的新分支,就像指定的一样。-B--detach-b $(basename <path>)

从 Git 2.17 开始,您可以使用git worktree remove.

但是,同样的remove命令还包括:

不干净的工作树或带有子模块的树可以用--force.
无法删除主工作树。

是的...除了在 Git 2.17--force中没有完全实现。

在 Git 2.18(2018 年第二季度)中,“ git worktree remove”了解到“ -f”是“ --force”选项的简写,就像“git worktree add”一样。

请参阅Stefan Beller ( ) 的提交 d228eea(2018 年 4 月 17 日。 帮助者:Eric Sunshine ( )(由Junio C Hamano 合并 -- --提交 90186fa中,2018 年 5 月 8 日)stefanbeller
sunshineco
gitster

worktree: 接受为移除-f的缩写--force

许多命令支持“ --force”选项,通常缩写为“ -f”。
然而,尽管记录了“ ”作为支持,“ git worktree remove”的手卷OPT_BOOL却忘记了识别短格式。 替换为,它免费提供“ ”,并使 ' ' 与 ' ' 选项解析(也指定标志)一致。git-worktree.txt-f
OPT_BOOLOPT__FORCE-fremoveaddPARSE_OPT_NOCOMPLETE

于 2018-05-20T20:49:14.787 回答
2

似乎您可以使用分离模式运行--detach,这不会创建分支。如果您不打算在工作树中进行修改,而只是运行构建或运行测试,这可能会很有用。

来源: https ://stacktoheap.com/blog/2016/01/19/using-multiple-worktrees-with-git/#long-running-tasks

于 2017-09-27T13:16:39.243 回答