我无法签出一个特定的分支,"独立的HEAD状态"

mno*_*ber 30 git github

我和我的朋友有一个他创建的回购.然后,他创建了一个名为"lexer"的分支,供我们继续使用.

问题是虽然他可以在主人和词法分析者之间切换回来,但它对我来说根本不起作用.

最后我刚开始(rm -rf repo然后克隆了回购)但是仍然无法检查词法分支?

在一个新克隆的回购:

git branch 得到:

$ git branch
* master
Run Code Online (Sandbox Code Playgroud)

git checkout lexer 得到:

$ git checkout lexer
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Run Code Online (Sandbox Code Playgroud)

我可以结账起源/词法分析器,但我最终处于独立的HEAD状态?

$ git checkout origin/lexer master
Note: checking out 'origin/lexer'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
Run Code Online (Sandbox Code Playgroud)

我可以通过这样做来推动词法分支

git push origin HEAD:lexer
Run Code Online (Sandbox Code Playgroud)

但是,我真的想把这个烂摊子搞得一团糟.它是如此奇怪,它适用于他,但不适合我?他说他没有从git repo那里得到任何局部变化......

有人有任何线索吗?

Per*_*son 43

我猜想你有一个名为lexer顶级的目录.既然git checkout用于切换分支和重置树中的文件,它可能检测到你没有被调用的分支,lexer但你确实有一个路径并选择第二种模式.它适用于你的朋友,因为他已经有一个lexer分支.

最简单的解决方法可能是使用git branch而不是创建分支.

git branch --track lexer origin/lexer
Run Code Online (Sandbox Code Playgroud)

应该为你做到这一点.然后,您可以使用git checkout它切换到它.

另一种选择可能是使用--标志来git checkout.我没有尝试过,但我认为它应该有效:

git checkout lexer --
Run Code Online (Sandbox Code Playgroud)

添加时--,前面的单词始终被视为分支/提交/树和路径后面的单词.

  • 我遇到过这个问题——没有同名的冲突目录。第二个命令将允许结帐,但仍然具有分离的 HEAD。第一个(添加跟踪信息)是正确的答案。另一个有用的变体:`git checkout -t origin/lexer`。谢谢! (2认同)

Phi*_*l H 12

TLDR:这可能只是一个语法问题。代替

git checkout origin/mybranch
Run Code Online (Sandbox Code Playgroud)

尝试:

git checkout mybranch
Run Code Online (Sandbox Code Playgroud)

git 采取的步骤,给出以下命令:

git checkout origin/mybranch
Run Code Online (Sandbox Code Playgroud)
  1. git 在本地存储库中查找名为“origin/mybranch”的分支。
  2. 找不到它,它会在可用的遥控器中寻找一个名为“origin/mybranch”的分支。
  3. 也没有找到,它尝试将其视为提交标记,并针对特定提交找到标记“origin/mybranch”。它以分离状态为您检查该提交。

但这不是你想要的!您想要名为“mybranch”的分支。如果只有一个遥控器有这样的分支(并且本地没有任何事情可以混淆),那么 git 会假设您是指这种用法,并<remote>为您填写:

git checkout -b <branch> --track <remote>/<branch>
Run Code Online (Sandbox Code Playgroud)

如果找不到具有匹配名称的分支,则默认为:

git checkout [--detach] <commit> 
Run Code Online (Sandbox Code Playgroud)

这就是分离的 HEAD 消息的来源。

查看git checkout 文档,并仔细注意<branch>vs <remote>


Phi*_*ppe 9

您无法签出,lexer因为您的本地存储库中没有分支(当然还有一个具有相同名称的文件夹).您只有远程分支'origin/lexer'.首先,您必须创建本地分支:

git checkout -b lexer origin/lexer
Run Code Online (Sandbox Code Playgroud)

对该主题的一个很好的解释:https://git-scm.com/book/en/v2/Git-Branching-Remote-Branches#Tracking-Branches


Den*_*nov 7

您可能想要这样:

git checkout -t origin/lexer
Run Code Online (Sandbox Code Playgroud)

从git手册:

为方便起见,--track不带-b表示创建分支...

-t,--track ...创建新分支时,设置“上游”配置...如果未提供-b选项,则新分支的名称将从远程跟踪分支派生