git签出分支导致磁头分离

git签出分支导致磁头分离,git,bitbucket,branch,Git,Bitbucket,Branch,正在尝试签出系统上尚不存在的远程分支。就这个问题而言,我的系统上没有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时,每次都会让我处于一种超然的状态。我试过的

正在尝试签出系统上尚不存在的远程分支。就这个问题而言,我的系统上没有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时,每次都会让我处于一种超然的状态。我试过的每台机器上都会发生这种情况

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

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

谢谢,
Dave检查您的本地标签:

git tag --list
如果您有一个名为V2.0005B3的标记,那么运行git checkout V2.0005B3将导致您的情况:在该标记指向的提交上出现分离的头状态

如果要在此处创建分支,请运行: 如果要删除标记,请执行以下操作:
如果这是共享回购,请告诉所有同事也删除他们的本地标签;这将避免在他们的机器上出现意外行为,并减少该标记在中央回购上可能再次出现的情况。

检查您的本地标记:

git tag --list
如果您有一个名为V2.0005B3的标记,那么运行git checkout 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签出,-c用于git交换机创建V2.0005B3,上游原点/V2.0005B3已设置

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

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

但是,如果失败,它将转到中描述的通常的六步过程,即在远程跟踪名称之前尝试标记名称。请注意,尝试将名称作为标记名是第3步,它位于第4步之前,尝试将名称作为分支名称:但是git checkout在进入六步流程之前已经完成了自己的私有步骤4

如果没有标签,Git将继续执行步骤5和6,步骤5将找到远程跟踪名称。这将在稍后调用DWIM代码来创建分支,除非您使用了-no guess选项。这个选项在Git2.21中是新的

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

-track选项告诉Git使用哪个选项,从而巧妙地避开了这个难题。还有另一个技巧,也是Git2.19中的新技巧:checkout.defaultRemote告诉Git checkout和Git switch中的-guess代码,如果存在多个匹配项,则首选哪个remote。因此,除了-track之外,如果问题是多个具有相同分支名称的远程设备,您可以配置首选远程设备,以便选择正确的远程跟踪名称。

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

首先,还有一种方法可以从相当短的远程跟踪名称创建本地分支,即使用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签出,-c用于git交换机创建V2.0005B3,上游原点/V2.0005B3已设置

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

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

但是,如果失败,它将转到中描述的通常的六步过程,即在远程跟踪名称之前尝试标记名称。请注意,尝试将名称作为标记名是第3步,它位于第4步之前,尝试将名称作为分支名称:但是git checkout在进入六步流程之前已经完成了自己的私有步骤4

如果没有标签,Git将继续执行步骤5和6,步骤5将找到远程跟踪名称。这将在稍后调用DWIM代码来创建分支,除非您使用了-no guess选项。这个选项在Git2.21中是新的

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


-track选项告诉Git使用哪个选项,从而巧妙地避开了这个难题。还有另一个技巧,也是Git2.19中的新技巧:checkout.defaultRemote告诉Git checkout和Git switch中的-guess代码,如果存在多个匹配项,则首选哪个remote。因此,除了-track之外,如果问题是多个具有相同分支名称的远程设备,您可以配置首选远程设备,以便选择正确的远程跟踪名称。

如果您提供一个git消息的快照,当它使您处于分离头状态时,这将非常有用。您还可以尝试使用完整的refspec,即git checkout refs/heads/V2.0005B3?git checkout V2.0005B3和git branch吗?V2.0005B3也是一个标签吗?@pro_gamer:不幸的是,git checkout拒绝使用refs/heads/作为选择分支名称的方式。在这种情况下,OP还没有将该分支作为分支名称,因此即使Git允许这种语法,它也不起作用,但Git会将带前缀的分支名称视为-detach请求,因此它不会以两种方式都起作用。如果您提供Git消息的快照,当它将您置于分离的头状态时,您将得到该消息,这将非常有用。您还可以尝试使用完整的refspec,即git checkout refs/heads/V2.0005B3?git checkout V2.0005B3和git branch吗?V2.0005B3也是一个标签吗?@pro_gamer:不幸的是,git checkout拒绝使用refs/heads/作为选择分支名称的方式。在这种情况下,OP还没有将该分支作为分支名称,因此即使Git允许这种语法,它也不会工作,但Git会将带前缀的分支名称视为一个-detach请求,因此它不会以两种方式工作。是的,就是这样!我不知道在你删除了分支的本地副本后,标签作为参考挂起了。编辑:改写了我的最后一段;我原以为GitPush默认情况下会推送标签,但有人提醒我它不会。如果标记出现在中央回购协议上,git pull会获取标记。是的,就是这样!我不知道在你删除了分支的本地副本后,标签作为参考挂起了。编辑:改写了我的最后一段;我原以为GitPush默认情况下会推送标签,但有人提醒我它不会。如果标记出现在中央回购上,那么git pull会获取标记。