Any checkout of a commit that is not the name of one of your branches will get you a detached HEAD. A SHA1 which represents the tip of a branch still gives a detached HEAD. Only a checkout of a local branch name avoids that mode.
See committing with a detached HEAD
When HEAD is detached, commits work like normal, except no named branch gets updated. (You can think of this as an anonymous branch.)
For example, if you checkout a “remote branch” without tracking it first, you can end up with a detached HEAD.
See git: switch branch without detaching head
git checkout origin/main (or
origin/master in the old days) would result in:
Note: switching to 'origin/main'. 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 switching back to a branch. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -c with the switch command. Example: git switch -c <new-branch-name> Or undo this operation with: git switch - Turn off this advice by setting config variable advice.detachedHead to false HEAD is now at a1b2c3d My commit message
That is why you should not use
git checkout anymore, but the new
git switch command.
git switch, the same attempt to “checkout” (switch to) a remote branch would fail immediately:
git switch origin/main fatal: a branch is expected, got remote branch 'origin/main'
To add more on
With Git 2.23 (August 2019), you don’t have to use the confusing
git checkout command anymore.
git switch can also checkout a branch, and get a detach HEAD, except:
- it has an explicit
To check out commit
HEAD~3for temporary inspection or experiment without creating a new branch:
git switch --detach HEAD~3 HEAD is now at 9fc9555312 Merge branch 'cc/shared-index-permbits'
- it cannot detached by mistake a remote tracking branch
C:\Users\vonc\arepo>git checkout origin/master Note: switching to 'origin/master'. 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 switching back to a branch.
Vs. using the new
git switch command:
C:\Users\vonc\arepo>git switch origin/master fatal: a branch is expected, got remote branch 'origin/master'
If you wanted to create a new local branch tracking a remote branch:
git switch <branch>
<branch>is not found but there does exist a tracking branch in exactly one remote (call it
<remote>) with a matching name, treat as equivalent to
git switch -c <branch> --track <remote>/<branch>
No more mistake!
No more unwanted detached HEAD!
And if you
git switch <tag> instead of
git switch --detach <tag>, Git 2.36 will help you to remember the missing