LeGEC的答案正确,但我会补充两点。第一点是关于如何获得您想要的内容,而第二点则更长,描述了另一个失败案例以及另一种解决方法。
首先,还有一种比较简短的方式可以从远程跟踪名称创建本地分支,那就是使用git checkout
(或git switch
)带上--track
选项和远程跟踪名称:
git checkout --track origin/V2.0005B3
该表单会定位远程跟踪名称(完整拼写为
refs/remotes/origin/V2.0005B3
),确认它确实是一个远程跟踪名(以
refs/remotes/
开头),应用
--track
选项来去掉
refs/remotes/origin
部分,得到
V2.0005B3
,然后使用分支创建选项(
-b
用于
git checkout
,
-c
用于
git switch
)创建具有上游
origin/V2.0005B3
的
V2.0005B3
。
其次:通常遇到此问题的原因是Git首先找到了标签,因为确实有这样的标签:
-
git checkout
代码首先尝试作为现有分支的名称给出的名称,即尝试在前面添加
refs/heads/
,看是否结果将解析为提交哈希ID。如果是,则这是一个现有的分支名称,因此是请求切换到该现有分支。
- 如果失败,则转向描述在
gitrevisions文档中的通常六个步骤的过程,其中尝试标签名称
之前尝试远程跟踪名称。请注意,“尝试名称作为标签名称”是第3步(在第4步之前“尝试名称作为分支名称”:但是
git checkout
在进入六个步骤的过程之前进行了它自己的私有步骤4)。
- 如果没有标签,Git将继续执行步骤5和6,步骤5将找到远程跟踪名称。这将调用稍后的“ DWIM”代码来创建分支,除非您使用了
--no-guess
选项。 (该选项在Git 2.21中新增。)
- 但是,此自动创建
--guess
模式失败的另一种方法是如果存在
两个或多个远程跟踪名称候选项。因此,例如,如果同时存在
origin/V2.0005B3
和
upstream/V2.0005B3
远程跟踪名称,则猜测模式不知道
要使用哪一个。
--track
选项会告诉Git要使用哪个远程分支,从而巧妙地避开这个困境。此外,在Git 2.19中还有另一个技巧:
checkout.defaultRemote
选项可以告诉
git checkout
和
git switch
命令中的
--guess
代码哪个远程分支是首选,如果存在多个匹配项。因此,除了使用
--track
外,如果问题是多个具有相同分支名称的远程分支,则可以配置首选远程分支以选择正确的远程跟踪分支名称。
git checkout V2.0005B3 && git branch
?V2.0005B3
也是一个标签吗? - phdgit checkout
拒绝以refs/heads/<name>
的方式选择分支名称。在这种情况下,OP 尚未将该分支作为分支名称,因此即使 Git 允许此语法,它也不起作用,但 Git 会将带前缀的分支名称视为--detach
请求,因此两种方式都不起作用。 - torek