繁体   English   中英

git 结帐分支导致分离头

[英]git checkout branch causes detached head

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

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

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

我可以很好地运行git checkout V2.0005B2git 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.0005B3upstream/V2.0005B3远程跟踪名称,则猜测模式不知道使用哪一个

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM