我很确定我在一个流行的Git项目中看到分支有一个类似“feature/xyz”的模式。

然而,当我尝试用斜杠字符创建一个分支时,我得到一个错误:

$ git branch labs/feature
error: unable to resolve reference refs/heads/labs/feature: Not a directory
fatal: Failed to lock ref for update: Not a directory

同样的问题(我最初的尝试):

$ git checkout -b labs/feature

如何在Git中创建带有斜杠字符的分支?


当前回答

我忘了我已经有一个未使用的实验室分支了。删除它解决了我的问题:

git branch -d labs
git checkout -b labs/feature

解释:

每个名称只能是父分支或普通分支,不能两者都是。这就是为什么分支实验室和实验室/功能不能同时存在。

原因是:分支存储在文件系统中,你也不能在同一级别上有一个文件实验室和一个目录实验室。

其他回答

可以使用分层分支名称(带有斜杠的分支名称)。例如,在我的存储库中,我有这样的分支。需要注意的是,你不能在存储库中同时拥有分支'foo'和分支'foo/bar'。

您的问题不在于创建名称上带有斜杠的分支。

$ git branch foo/bar
error: unable to resolve reference refs/heads/labs/feature: Not a directory
fatal: Failed to lock ref for update: Not a directory

上面的错误信息讨论的是'labs/feature'分支,而不是'foo/bar'(除非它是复制和粘贴中的错误,即你编辑了会话的部分)。git分支或git rev-parse——symbol -full-name HEAD的结果是什么?

如果有人遇到这个问题,他们无法签出到例如:features/23的分支,因为它说分支功能存在,但你在Github上找不到它-可能是你有一个名为features的本地分支导致了这个问题。

使用git branch -D特性删除本地分支,然后你应该能够使用git checkout features/23进行checkout,并且它应该能正常工作。

刚刚有同样的问题,但我再也找不到冲突的分支了。

在我的情况下,回购有和“foo”分支之前,但不再,我试图创建和签出“foo/酒吧”从远程。 正如我所说的,“foo”已经不存在了,但这个问题仍然存在。

最后,分支“foo”仍然在.git/config文件中,删除它之后一切都好了:)

我在Visual Studio Git Changes中做到这一点

如前所述。我错误地创建了一个开发分支。 主要 dev

我想以后我可以把它们命名为dev/somebranchname。

解决方案是删除dev,然后创建dev/somebranchname。下一个开发分支将被称为dev/nextbranchname。 这与Visual Studio集成得很好,在Visual Studio中,dev变成了一个文件夹视图,分支在此之后排列起来

你确定分支实验室不存在吗(就像在这个线程中一样)?

不能同时拥有同名的文件和目录。 你想让git做的基本上是这样的: % CD .git/refs/heads % ls -l 总0 -rw-rw-r——1 jhe jhe 41 2009-11-14 23:51实验室 -rw-rw-r——1 jhe jhe 41 2009-11-14 23:51 master % mkdir实验室 mkdir:不能创建目录“实验室”:文件存在 您将得到与“不能创建目录”错误相同的结果。 当你有一个带有斜杠的分支时,它会被存储为 .git/refs/heads下的目录层次结构。


注意,实验室不能是现有的分支,正如ddruganov在评论中指出的那样:

 git switch -c 19023-commerce/19033-commerce-view 19023-commerce

 # Fails with:

 fatal: cannot lock ref 'refs/heads/19073-commerce-view/99999-test-branch': 
 'refs/heads/19073-commerce-view' exists; 
  cannot create 'refs/heads/19073-commerce-view/99999-test-branch'

正如在“git push: refs/heads/my/subbranch exists, cannot create”中解释的那样:

如果分支b存在,则不能创建名为b/anything的分支。 同样,如果分支dev/b存在,则不能创建dev/b/c。 这是git的内部限制。