[英]git checkout branch causes detached head
尝试签出我的系统上尚不存在的远程分支。 出于这个问题的目的,我的系统上不存在 3 个分支。
git branch -r
显示远程相关分支的列表:
origin/V2.0005B2
origin/V2.0005B3
origin/V2.0005B4
我可以很好地运行git checkout V2.0005B2
或git checkout V2.0005B4
,它会创建一个本地副本并将其设置为跟踪。
但是当我尝试运行git checkout V2.0005B3
时,它每次都会让我处于一个分离的头 state 中。 它发生在我尝试过的每台机器上。
SourceTree 可以很好地检查这个分支以及 git fork。 但是Git bash命令行有这个问题。
我只希望这个分支没有任何问题,否则只要它最初是使用其他实用程序之一检出的,它似乎就可以正常工作。 该分支位于 BitBucket 并且我已经登录那里查看是否可以看到任何异常,但它看起来与其他分支相同。
谢谢,戴夫
检查您的本地标签:
git tag --list
如果您有一个名为V2.0005B3
的标签,运行git checkout V2.0005B3
将导致您的情况:分离的 HEAD state,在该标签指向的提交上。
git checkout -b V2.0005B3
git branch -u origin/V2.0005B3
# or shorter suggested by @torek :
git checkout --track origin/V2.0005B3
# delete your local tag :
git tag -d V2.0005B3
# delete the remote tag :
git push -d origin refs/tags/V2.0005B3
如果这是一个共享仓库,请告诉所有同事也删除他们的本地标签; 这将避免在他们的机器上出现令人惊讶的行为,并减轻该标签在中央存储库上可能再次出现的可能性。
就目前而言, LeGEC 的回答是正确的,但我要补充两点。 第一个是关于如何得到你想要的,第二个更长的点描述了另一个失败案例和解决它的另一个技巧。
首先,还有另一种方法可以从相当短的远程跟踪名称创建本地分支,即使用带有--track
选项和远程跟踪名称的git checkout
(或git switch
):
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
V2.0005B3 .
第二:出现这个问题的通常原因是Git先找到标签,因为有这样一个标签:
git checkout
代码尝试将您首先提供的名称作为现有分支的名称,即尝试在前面添加refs/heads/
以查看结果是否会解析为提交 hash 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
之外,如果问题是具有相同分支名称的多个遥控器,您可以配置首选遥控器以选择正确的远程跟踪名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.