我无法签出特定的分支,“分离的HEAD状态”

时间:2016-02-13 18:25:01

标签: git github

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

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

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

在新克隆的回购中:

git branch给出:

$ git branch
* master

git checkout lexer给出:

$ git checkout lexer
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

我可以结帐原点/词法分析器,但我最终处于分离的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.

我可以通过

推送到词法分支
git push origin HEAD:lexer

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

任何人都有任何线索?

8 个答案:

答案 0 :(得分:39)

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

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

git branch --track lexer origin/lexer

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

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

git checkout lexer --

当您添加--时,它之前的单词始终被视为分支/提交/树以及路径后的单词。

答案 1 :(得分:6)

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

git checkout -b lexer origin/lexer

关于这个问题的一个很好的解释:https://git-scm.com/book/en/v2/Git-Branching-Remote-Branches#Tracking-Branches

答案 2 :(得分:6)

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

git checkout origin/mybranch

尝试:

git checkout mybranch

在执行以下命令的情况下,git采取的步骤:

git checkout origin/mybranch
  1. git在本地存储库中查找一个名为“ origin / mybranch”的分支。
  2. 找不到它,然后它将在可用的遥控器中查找一个名为“ origin / mybranch”的分支。
  3. 两者均未找到,它尝试将其视为提交标记,并针对特定提交找到标记“ origin / mybranch”。它以分离状态为您签出该提交。

但这不是您想要的!您想要一个名为“ mybranch”的分支。如果只有一个远程服务器具有这样的分支(本地没有什么可混淆的问题),那么git将假定您是这种用法,并为您填写<remote>

git checkout -b <branch> --track <remote>/<branch>

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

git checkout [--detach] <commit> 

分离的HEAD消息进入的位置。

请参见the git checkout docs,并仔细注意<branch><remote>

答案 3 :(得分:3)

您进入分离的HEAD状态,因为origin/lexer是一个远程跟踪分支,因此只读。您只想结帐lexer,并就此开展工作。然后,当您推送时,origin/lexer将会更新。

编辑:重读你的问题,我看到你曾试图结帐词法分析器,但最终仍然坚持主人。奇怪的是git checkout无声地失败了。试试git checkout -t origin/lexer

答案 4 :(得分:3)

您可能想要这个:

git checkout -t origin/lexer

来自git手册:

  

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

  

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

答案 5 :(得分:1)

另一个猜测:你有一个名字相同的标签,所以

projects = File.read('./_data/projects.json')
projects_file = JSON.parse(projects)
projects_file.each do |project|
  File.open("./_projects/#{file_name}.md", 'w+') do |file|
    # A bunch of YAML Front-Matter written to file.
  end
end

实际上检出了标签,而不是分支

答案 6 :(得分:0)

执行:git checkout origin/lexer master时,您只需将HEAD更改为指向remote分支中的最新提交。这是一个只读分支。

如果您想了解HEAD的内容,请阅读以下内容:
How to move HEAD back to a previous location? (Detached head)

在您的情况下,您只需要执行以下操作:

使用包含所有分支和标记的最新代码更新您的存储库

# Update your local repository with all the remote branches
# --prune = remove all deleted data locally which was removed on the remote
git fetch --all --prune

现在你应该在本地拥有最新的分支。

删除旧的本地分支

<强> !!!重要:
如果您进行了修改并且没有推送它们,请不要删除本地分支

git branch -D lexer 

签出所需的分支

# don't use the remote simply the branch name
git checkout lexer 

现在您有一个本地分支,其名称为lexer,已从远程分支中签出

答案 7 :(得分:-1)

我只是替换命令

aHref

$ git checkout v4.9.0

它对我有用。