首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >git检出支路引起分离头

git检出支路引起分离头
EN

Stack Overflow用户
提问于 2021-04-27 18:00:22
回答 2查看 710关注 0票数 3

尝试签出我的系统上还不存在的远程分支。就这个问题而言,我的系统上没有三个分支机构。

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

代码语言:javascript
运行
复制
  origin/V2.0005B2
  origin/V2.0005B3
  origin/V2.0005B4

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

但是当我尝试运行git checkout V2.0005B3时,它每次都会使我处于一个独立的头部状态。在我试过的每台机器上都会发生这种情况。

SourceTree可以检出这个分支以及git叉子。但是Git命令行存在这个问题。

我只希望这个分支没有什么问题,否则,只要它最初使用其他工具之一被检出,它就会正常工作。这个分支住在BitBucket,我在那里登录看看是否能看到什么不寻常的东西,但它看起来和其他的一样。

谢谢,戴夫

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-27 21:13:57

检查您的本地标签:

代码语言:javascript
运行
复制
git tag --list

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

  • 如果要在那里创建分支,请运行:
代码语言:javascript
运行
复制
git checkout -b V2.0005B3
git branch -u origin/V2.0005B3

# or shorter suggested by @torek :
git checkout --track origin/V2.0005B3
  • 如果要删除标记:
代码语言:javascript
运行
复制
# delete your local tag :
git tag -d V2.0005B3

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

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

票数 4
EN

Stack Overflow用户

发布于 2021-04-28 02:12:46

LeGEC的答案是正确的到目前为止,但我要补充两点。第一个是关于如何得到你想要的,第二个,更长的点,描述了另一个失败案例,还有另一个绕过它的技巧。

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

代码语言:javascript
运行
复制
git checkout --track origin/V2.0005B3

此特定表单定位远程跟踪名称(完全拼写refs/remotes/origin/V2.0005B3),发现它确实是远程跟踪名称(以refs/remotes/开头),应用--track选项提取refs/remotes/origin部件以生成V2.0005B3,然后使用分支创建选项(-b for git checkout-c for git switch)创建已设置的V2.0005B3上游origin/V2.0005B3

第二:造成此问题的通常原因是Git首先查找标记,因为存在这样的标记:

  • git checkout代码首先尝试将其命名为现有分支的名称--即尝试在前面添加refs/heads/,以查看结果是否将解析为提交散列ID。如果是,这是一个现有的分支名称,因此是一个切换到现有分支的请求。
  • 但是,如果失败,它将转到the修订文件中描述的通常的六步进程,它在远程跟踪名称之前尝试一个标记名。注意,“尝试名称作为标记名”是步骤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之外,如果问题是具有相同分支名称的多个远程处理程序,则可以配置首选的remote,以便选择正确的远程跟踪名称。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67288369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档