为什么Git Worktree add会创建一个分支,我能删除它吗?

31

我使用 git worktree add 命令创建了一个新的工作树,发现它在存储库中创建了一个与工作树同名的新分支。这个分支有什么作用呢?

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


我可能错了,但我的猜测是,在工作树中工作时,这个分支才是你实际所在的分支。 - Tim Biegeleisen
我认为在创建工作树时,我应该指定我想要检出的预先存在的分支,而不是之后切换分支。那么我就可以避免创建新分支了。 - Tor Klingberg
1
我无法确切地说为什么他们这样做,但是是的,您必须为新的工作树指定一个分支,因此它们默认将其创建为与新的工作树同名的分支。他们本可以让git worktree add /path/to/foo在没有-b-B或最后一个参数的情况下失败,而不是在这里默认使用foo,但我猜想他们认为在这里默认使用foo更方便。 - torek
如果您不想创建新的分支,可以运行 git worktree add --detach </path/to/worktree>,这样您将得到一个分离的 HEAD。这是我经常使用的方法。如果您计划检出某个现有分支,则可以执行 git worktree add </path/to/worktree> <my-branch> - clacke
注意:删除工作树相关元素的方法是:git worktree --remove(适用于Git 2.17+,2018年第二季度):请参见我的答案 - VonC
6个回答

53

当其他人回答这个问题时,我在这里放置了删除文件夹,删除工作树和删除分支的命令:

首先,列出所有工作树以进行双重检查...

$ git worktree list

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

$ rm -rf path/to/worktree

之后,删除工作树本身。

$ git worktree prune

如果你有多个工作树(worktree),上面的命令只会清理那些路径已不存在的工作树,所以不用担心!

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

$ git branch -D <branch-name>

工作树不一定与其自己的分支相关联。 因此,值得在建议删除分支时添加保留。 - Ben Carp
在我执行了 rm -rf path/to/worktreegit worktree prune 之后,我所拥有的 /.git/worktree 目录被删除了。这是预期的结果。 - mfaani

20

这个分支是必需的,因为您不能同时在不同的工作树中检出相同的分支。

因此,如果您在添加工作树时未指定分支,则Git将根据当前分支自动添加一个分支,并使用工作树目录名称作为分支名称。

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

顺便说一下,这也是为什么您不能推送到已检出的非裸库分支的原因。

关于您的最后一个问题:您可以删除该分支吗?当然,该分支并没有特殊之处。只要没有任何地方检出该分支,您就可以删除它。


1
谢谢!我在https://dev59.com/YFkS5IYBdhLWcg3wkHp2单独询问了双重结帐问题。 - Tor Klingberg

17

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

git worktree remove <path>

那很棒。 - Siraj Alam

3

git worktree将在未指定分支的情况下添加一个新分支:

如果省略了<commit-ish>且没有使用-b-B--detach, 则为方便起见,将自动创建一个基于HEAD的新分支,就像指定了-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"一样。

请参见提交d228eea(2018年4月17日)由Stefan Beller (stefanbeller)完成。
帮助者: Eric Sunshine (sunshineco).
(由Junio C Hamano -- gitster --提交90186fa中合并)

worktree: 接受-f作为删除时--force的缩写

许多命令支持"--force"选项,通常缩写为"-f"。
然而,"git worktree remove"手动编写的OPT_BOOL忘记识别短格式,尽管git-worktree.txt文档记录了"-f"被支持。
OPT__FORCE替换OPT_BOOL,这将免费提供"-f",并使'remove'与'add'选项解析一致(后者还指定了PARSE_OPT_NOCOMPLETE标志)。


3

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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接