I can't checkout a specific branch, "detached HEAD state"

Me and my friend has a repo which he created. He then created a branch called "lexer" for us to work on.

The problem is that while he can switch forth and back between master and lexer it does not work at all for me.

Eventually I just started over ( rm -rf repo and then cloned the repo) but it's still impossible to checkout the lexer branch?

On a freshly cloned repo:

git branch gives:

$ git branch
* master

git checkout lexer gives:

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

I CAN checkout origin/lexer but I end up in a detached HEAD state?

$ 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.

It is possible for me to push to the lexer branch by doing

git push origin HEAD:lexer

but well, I really would like to sort this mess out. It's so weird that it works for him but not for me? He says that he hasn't got any local changes from the git repo either...

Anyone have any clue?


I'm going to venture a guess that you have a directory named lexer at the top level. Since git checkout is used both to switch branches and to reset files in the tree, it's probably detecting that you don't have a branch called lexer but you do have a path and selects the second mode. It works for your friend because he already has a lexer branch.

Easiest workaround is probably to create the branch using git branch instead.

git branch --track lexer origin/lexer

should do that for you. You can then use git checkout to switch to it.

Another option might be to use the -- flag to git checkout. I haven't tried it but I think it should work:

git checkout lexer --

When you add -- , the word before it is always considered a branch/commit/tree and the word after a path.


You can't checkout lexer because you don't have the branch in your local repository (and surely a folder with the same name) . You only have the remote branch 'origin/lexer'. First you have to create the local branch :

git checkout -b lexer origin/lexer

A good explaination on the subject: https://git-scm.com/book/en/v2/Git-Branching-Remote-Branches#Tracking-Branches


You get into a detached HEAD state because origin/lexer is a remote tracking branch, and thus read only. You want to just checkout lexer , and do your work on that. Then, when you push, origin/lexer will be brought up to date.

Edit : Rereading your question, I see that you have tried to checkout lexer, but end up staying on master. It is strange that git checkout is failing silently. Try git checkout -t origin/lexer .

链接地址: http://www.djcxy.com/p/18820.html

上一篇: 签出旧的提交并使其成为新的提交

下一篇: 我无法签出特定的分支,“脱离HEAD状态”