我使用 git worktree add
命令创建了一个新的工作树,发现它在存储库中创建了一个与工作树同名的新分支。这个分支有什么作用呢?
我已经在第二个工作树中检出了另一个预先存在的分支。我可以自由地删除 git worktree add
创建的那个分支吗?
我使用 git worktree add
命令创建了一个新的工作树,发现它在存储库中创建了一个与工作树同名的新分支。这个分支有什么作用呢?
我已经在第二个工作树中检出了另一个预先存在的分支。我可以自由地删除 git worktree add
创建的那个分支吗?
当其他人回答这个问题时,我在这里放置了删除文件夹
,删除工作树
和删除分支
的命令:
首先,列出所有工作树以进行双重检查...
$ git worktree list
然后,删除工作树文件夹。
$ rm -rf path/to/worktree
之后,删除工作树本身。
$ git worktree prune
如果你有多个工作树(worktree),上面的命令只会清理那些路径已不存在的工作树,所以不用担心!
最后,删除分支(与工作树相同的分支名)。
$ git branch -D <branch-name>
rm -rf path/to/worktree
和 git worktree prune
之后,我所拥有的 /.git/worktree
目录被删除了。这是预期的结果。 - mfaani这个分支是必需的,因为您不能同时在不同的工作树中检出相同的分支。
因此,如果您在添加工作树时未指定分支,则Git将根据当前分支自动添加一个分支,并使用工作树目录名称作为分支名称。
你可能会问,为什么我不能将同一分支检出两次?想象一下,当您提交到B时,如果它们都共享分支,那么工作树A将把B中的提交视为本地差异,但是相反!就像执行了git reset --soft HEAD^
一样...那将非常危险。
顺便说一下,这也是为什么您不能推送到已检出的非裸库分支的原因。
关于您的最后一个问题:您可以删除该分支吗?当然,该分支并没有特殊之处。只要没有任何地方检出该分支,您就可以删除它。
从 Git 2.17.0 版本开始,您可以安全地运行这个一体化命令。
git worktree remove <path>
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
标志)。
看起来你可以使用--detach
选项在分离模式下运行,这不会创建分支。如果你不打算在工作树中进行修改,而只是运行构建或运行测试,那么这可能会很有用。
来源: https://stacktoheap.com/blog/2016/01/19/using-multiple-worktrees-with-git/#long-running-tasks
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.
git worktree add /path/to/foo
在没有-b
或-B
或最后一个参数的情况下失败,而不是在这里默认使用foo
,但我猜想他们认为在这里默认使用foo
更方便。 - torekgit worktree add --detach </path/to/worktree>
,这样您将得到一个分离的 HEAD。这是我经常使用的方法。如果您计划检出某个现有分支,则可以执行git worktree add </path/to/worktree> <my-branch>
。 - clackegit worktree --remove
(适用于Git 2.17+,2018年第二季度):请参见我的答案。 - VonC