DevOps & Platform
5 min readMay 30, 2026Updated August 19, 2026

Fix Git Detached HEAD State

AJ
Ajeet Yadav
Platform & Cloud Engineer
Fix Git Detached HEAD State

Quick answer

Detached HEAD means Git's HEAD pointer points directly at a commit instead of a branch. Commits made in this state belong to no branch and can be lost. Here's how to get back to a branch and how to rescue commits you already made.

5 min read · DevOps & Platform

Fix Git Detached HEAD State

$ git status
HEAD detached at a3f2d1c
nothing to commit, working tree clean

or after a checkout:

Note: switching to 'v1.4.2'.

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 -

What Detached HEAD Means

In normal Git operation, HEAD points to a branch name (like main), and that branch points to the latest commit. When you commit, the branch advances.

In detached HEAD state, HEAD points directly to a commit hash — not a branch. This means:

  • New commits you make won't belong to any branch
  • When you switch to another branch, those commits become unreachable (no reference points to them)
  • Git's garbage collector can delete unreachable commits after 30 days (or 90 days in some configs)

It looks like this in the ref chain:

Normal:    HEAD → main → commit abc123
Detached:  HEAD → commit abc123   (no branch in between)

How You Get Into Detached HEAD

  • git checkout <commit-hash> — explicitly checking out a commit
  • git checkout v1.4.2 — checking out a tag (tags aren't branches)
  • git bisect start — binary search for bugs puts you in detached HEAD at each test commit
  • Some git rebase operations if they're interrupted

Fix 1: You Haven't Made Any Commits — Just Go Back

If you only looked around and didn't commit anything:

bash
1# Return to the branch you were on before
2git checkout main
3
4# Or use git switch (modern syntax)
5git switch main
6
7# Or return to exactly where you were
8git switch -

Fix 2: You Made Commits — Save Them as a New Branch

If you made commits in detached HEAD state and want to keep them:

bash
# Create a new branch at the current HEAD position
git checkout -b my-feature

# Or with git switch
git switch -c my-feature

This creates my-feature pointing at your detached HEAD commit. HEAD is now attached to that branch. Your commits are safe.

Then merge or rebase onto main:

bash
1git checkout main
2git merge my-feature
3
4# Or rebase (linear history)
5git rebase main my-feature
6git checkout main
7git merge --ff-only my-feature

Stuck on this in production?

We debug exactly this kind of issue for platform teams — usually in a single working session.

Talk to us

Fix 3: You Switched Away and Lost the Commits

If you accidentally switched to another branch before creating a rescue branch, the commits appear lost — but they're not. Git doesn't delete them immediately. Find them in the reflog:

bash
git reflog
abc1234 (HEAD -> main) HEAD@{0}: checkout: moving from a3f2d1c to main
a3f2d1c HEAD@{1}: commit: add feature X
b7e8c91 HEAD@{2}: commit: start feature X
f2d4a01 HEAD@{3}: checkout: moving from main to f2d4a01
...

Find the last commit you made in detached HEAD state (e.g., a3f2d1c — "add feature X") and create a branch pointing at it:

bash
git checkout -b rescue-branch a3f2d1c

Your commits are now on rescue-branch.


Checking Out Tags Safely

If your goal is to inspect a specific version (tag), check it out but don't commit — you're just browsing:

bash
git checkout v1.4.2
# Browse files, run tests, etc.
git checkout main    # Return when done

If you want to start work based on a tag (e.g., a hotfix branch), create a branch immediately:

bash
git checkout -b hotfix/v1.4.3 v1.4.2
# Now on a proper branch, safe to commit

Summary

SituationFix
No commits madegit checkout main
Commits made, still in detached HEADgit checkout -b new-branch
Switched away alreadygit refloggit checkout -b rescue <hash>

See Also

Frequently Asked Questions

Is detached HEAD dangerous?

Not in itself — you are simply on a commit rather than a branch, and Git is telling you so. It becomes dangerous only when you commit there and then switch away, because nothing references those commits and they eventually become garbage. Create a branch before committing and the state is entirely ordinary.

I already committed and switched away. Are those commits gone?

Almost certainly not. git reflog records where HEAD has been, so the commit is findable by its hash for as long as it survives garbage collection — typically weeks. Create a branch pointing at that hash and the work is back.

Why do I end up here after a checkout?

Because you checked out something that is not a branch — a tag, a remote-tracking branch, or a raw commit hash. All three are valid positions and none of them is a branch, so HEAD has nothing to follow. Checking out a tag is the most common route.

How do I inspect an old commit without detaching?

Use git show or git diff against the hash, which reads without moving HEAD. Detaching is only necessary when you want a working tree at that state — to build or test it — and even then creating a throwaway branch is usually clearer.

Official References

Was this article helpful?

Be the first to rate this article

Related Topics

Git
Troubleshooting
Version Control
DevOps

Found this useful? Share it.

Practice this

Read Next