git 结帐分支导致分离头
git checkout branch causes detached head
正在尝试检出我的系统上尚不存在的远程分支。出于这个问题的目的,我的系统上存在 3 个分支中的 none。
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 分支。但是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.0005B3
和 upstream/V2.0005B3
远程跟踪名称,猜测模式不知道 使用哪一个 。
--track
选项告诉 Git 使用哪一个,从而巧妙地回避了这一难题。 Git 2.19 中还有另一个新技巧:checkout.defaultRemote
告诉 git checkout
和 git switch
中的 --guess
代码哪个遥控器是 preferred,如果有多个匹配。所以除了--track
之外,如果问题是多个具有相同分支名称的远程,您可以配置一个首选远程以选择正确远程跟踪名称。
正在尝试检出我的系统上尚不存在的远程分支。出于这个问题的目的,我的系统上存在 3 个分支中的 none。
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 分支。但是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.0005B3
和 upstream/V2.0005B3
远程跟踪名称,猜测模式不知道 使用哪一个 。
--track
选项告诉 Git 使用哪一个,从而巧妙地回避了这一难题。 Git 2.19 中还有另一个新技巧:checkout.defaultRemote
告诉 git checkout
和 git switch
中的 --guess
代码哪个遥控器是 preferred,如果有多个匹配。所以除了--track
之外,如果问题是多个具有相同分支名称的远程,您可以配置一个首选远程以选择正确远程跟踪名称。