git 结帐分支导致分离头

git checkout branch causes detached head

正在尝试检出我的系统上尚不存在的远程分支。出于这个问题的目的,我的系统上存在 3 个分支中的 none。

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

  origin/V2.0005B2
  origin/V2.0005B3
  origin/V2.0005B4

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

但是当我尝试 运行 git checkout V2.0005B3 时,它每次都会让我处于超然的状态。它发生在我试过的每台机器上。

SourceTree 可以检查这个分支以及 git 分支。但是Gitbash命令行有这个问题

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

谢谢, 戴夫

检查您的本地标签:

git tag --list

如果你有一个名为 V2.0005B3 的标签,运行ning 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
  • 如果要删除标签:
# delete your local tag :
git tag -d V2.0005B3

# delete the remote tag :
git push -d origin refs/tags/V2.0005B3

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

就目前而言,但我要补充两点。第一个是关于如何得到你想要的东西,第二个,较长的一点,描述了另一个失败案例和另一个解决它的技巧。

首先,还有一种方法可以从相当短的远程跟踪名称创建本地分支,那就是使用 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) 创建 V2.0005B3 上游 origin/V2.0005B3 已经设置。

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

  • git checkout 代码尝试将您首先给它的名称作为现有分支的名称——即尝试在前面添加 refs/heads/ 以查看结果是否会解析提交哈希 ID。如果是这样,这是一个 existing 分支名称,因此请求切换到该现有分支。

  • 但是,如果 失败 ,它就会转向 the gitrevisions documentation 中描述的通常的六步过程,尝试标记名称 before 远程跟踪名称。请注意,“尝试将名称作为标签名称”是第 3 步(在第 4 步“尝试将名称作为分支名称”之前):但是 git checkout 在进入第六步之前就完成了自己的私人步骤 4 -步骤过程)。

  • 如果没有标签,Git 会转到第 5 步和第 6 步,第 5 步会找到远程跟踪名称。这将稍后调用“DWIM”代码来创建分支,除非您使用 --no-guess 选项。 (此选项是 Git 2.21 中的新选项。)

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

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