git checkout 分支导致头分离

Dav*_*wig 3 git branch bitbucket

尝试签出我的系统上尚不存在的远程分支。就这个问题而言,我的系统上不存在这 3 个分支。

git branch -r显示远程上相关分支的列表:

  origin/V2.0005B2
  origin/V2.0005B3
  origin/V2.0005B4
Run Code Online (Sandbox Code Playgroud)

我可以运行git checkout V2.0005B2git checkout V2.0005B4正常,它会创建一个本地副本并将其设置为跟踪。

但当我尝试跑步时,git checkout V2.0005B3每次都会让我处于一种超然的头脑状态。我尝试过的每台机器上都会发生这种情况。

SourceTree 可以像 git fork 一样检查这个分支。但是Git bash命令行就有这个问题。

我只希望这个分支没有任何问题,否则只要最初使用其他实用程序之一进行检查,它似乎就可以正常工作。该分支位于 BitBucket 中,我已登录那里查看是否可以看到任何异常情况,但它看起来与其他分支相同。

谢谢,戴夫

LeG*_*GEC 6

检查您的本地标签:

git tag --list
Run Code Online (Sandbox Code Playgroud)

如果您有一个名为 的标签V2.0005B3,运行git checkout V2.0005B3将导致您的情况:在该标签指向的提交上处于分离的 HEAD 状态。

  • 如果您想在那里创建分支,请运行:
git checkout -b V2.0005B3
git branch -u origin/V2.0005B3

# or shorter suggested by @torek :
git checkout --track origin/V2.0005B3
Run Code Online (Sandbox Code Playgroud)
  • 如果你想删除标签:
# delete your local tag :
git tag -d V2.0005B3

# delete the remote tag :
git push -d origin refs/tags/V2.0005B3
Run Code Online (Sandbox Code Playgroud)

如果这是共享存储库,请告诉所有同事也删除他们的本地标签;这将避免他们的机器上出现令人惊讶的行为,并减少该标签在中央存储库上可能重新出现的可能性。


tor*_*rek 5

LeGEC 的答案就目前而言是正确的,但我要补充两点。第一个是关于如何获得你想要的东西,第二个较长的点描述了另一个失败案例以及解决该问题的另一个技巧。

\n

首先,还有另一种方法可以从相当短的远程跟踪名称创建本地分支,那就是使用git checkout(或git switch) 与--track选项和远程跟踪名称:

\n
git checkout --track origin/V2.0005B3\n
Run Code Online (Sandbox Code Playgroud)\n

这种特殊形式定位远程跟踪名称(完整拼写refs/remotes/origin/V2.0005B3),发现它确实是远程跟踪名称(以 开头refs/remotes/),应用--track选项来剥离refs/remotes/origin部分以提出V2.0005B3,然后使用分支创建选项(-bfor git checkout, -cfor )使用已设置的上游git switch进行创建。V2.0005B3origin/V2.0005B3

\n

第二:这个问题通常的原因是Git先找到标签,因为有这样一个标签:

\n
    \n
  • 代码git checkout首先尝试将您指定的名称作为现有分支\xe2\x80\x94的名称,即尝试refs/heads/在前面添加以查看结果是否会解析为提交哈希 ID。如果是,则这是现有分支名称,因此是切换到该现有分支的请求。

    \n
  • \n
  • 但是,如果失败,则会转向gitrevisions 文档中描述的通常的六步过程,该过程会在远程跟踪名称之前尝试标签名称。请注意,“尝试将该名称作为标记名称”是步骤 3(它位于步骤 4“尝试将该名称作为分支名称”之前:但git checkout在进入六步过程之前执行了自己的私有步骤 4)。

    \n
  • \n
  • 如果没有标签,Git 将继续执行步骤 5 和 6,并且步骤 5 将找到远程跟踪名称。除非您使用该选项,否则这将稍后调用“DWIM”代码来创建分支--no-guess。(此选项是 Git 2.21 中的新选项。)

    \n
  • \n
\n

但还有一种情况会导致这种自动创建--guess模式失败,那就是如果存在两个或更多候选远程跟踪名称。因此,如果同时存在origin/V2.0005B3upstream/V2.0005B3远程跟踪名称,则猜测模式不知道使用哪一个

\n

--track选项告诉 Git 使用哪一个,从而巧妙地避开了这一困境。还有另一个技巧,也是 Git 2.19 中的新技巧:checkout.defaultRemote告诉两者--guess中的代码,如果有多个匹配项,则首选哪个远程。因此,此外,如果问题是多个具有相同分支名称的遥控器,您可以配置首选遥控器,以便选择正确的远程跟踪名称。git checkoutgit switch--track

\n