You check out a specific commit by hash, and Git warns you're in "detached HEAD" state. Any commits you make now won't belong to any branch and could be lost.
Introduction
This article covers troubleshooting steps and solutions for Git Detached HEAD: Complete Recovery Guide. The error typically occurs in production environments and can cause service disruptions if not addressed promptly.
Symptoms
Common error messages include:
git checkout abc1234``` Note: switching to 'abc1234'.
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 ```
Normal: HEAD -> main -> abc1234
Detached: HEAD -> abc1234 (no branch)The Warning
When checking out a commit hash:
git checkout abc1234Git responds:
``` Note: switching to 'abc1234'.
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 ```
What Detached HEAD Means
Normally, HEAD points to a branch (like main), and that branch points to a commit. In detached HEAD, HEAD points directly to a commit - no branch reference.
Normal: HEAD -> main -> abc1234
Detached: HEAD -> abc1234 (no branch)The commit exists, but no branch tracks it. If you make new commits, they're orphaned when you switch away.
Common Causes
Common causes:
- Checking out a commit hash directly
- Checking out a tag: git checkout v1.0.0
- Checking out a remote branch without creating local branch
- Rebase operations pause in detached state
- Some Git GUI tools checkout commits for inspection
Step-by-Step Fix
Diagnosis
Check current state:
``bash
git status
Shows:
``
HEAD detached at abc1234
nothing to commit, working tree clean
See where HEAD points:
``bash
git log -1
Find nearby branches:
``bash
git branch -a
Check if you have uncommitted changes:
``bash
git diff
git stash list
Solution 1: No Changes Made - Just Return
If you just looked around and made no commits:
git checkout mainOr:
``bash
git switch main
You're back on a branch. The detached state had no consequences.
Solution 2: Made Commits - Create Branch to Save Them
If you committed work in detached state:
Check what commits you made:
``bash
git log --oneline -5
Create a branch at current position:
``bash
git branch new-feature
git checkout new-feature
Or in one command:
``bash
git checkout -b new-feature
Now your commits belong to new-feature branch.
Solution 3: Made Commits - Merge Them to Existing Branch
Save commits then integrate them:
```bash # Create branch from detached state git branch temp-work
# Switch to main git checkout main
# Merge the work git merge temp-work
# Clean up git branch -d temp-work ```
Solution 4: Made Commits - Cherry-Pick Specific Ones
If you want only some commits from detached state:
```bash # Note the commit hashes from detached state git log --oneline
# Switch to target branch git checkout main
# Cherry-pick specific commits git cherry-pick abc1234 git cherry-pick def5678 ```
Solution 5: Uncommitted Work in Detached State
If you have uncommitted changes:
Stash them first:
``bash
git stash push -m "detached work"
Return to a branch:
``bash
git checkout main
Apply the stash:
``bash
git stash pop
Solution 6: Lost Detached Commits (Recovery)
If you switched away and lost detached commits:
Use reflog to find them:
``bash
git reflog
Look for entries like:
``
abc1234 HEAD@{0}: checkout: moving from main to abc1234
def5678 HEAD@{1}: commit: Work done in detached state
Recover by creating branch:
``bash
git branch recovered-work def5678
Or reset to that commit:
``bash
git checkout def5678
git checkout -b recovered-work
Solution 7: Checkout Tag Without Detaching
To work on a tag without detached HEAD:
git checkout -b v1.0-work v1.0.0Creates branch v1.0-work at tag v1.0.0.
Solution 8: Prevent Future Detached HEAD
Use git switch instead of checkout:
``bash
git switch main # Switch to branch
git switch -c feature # Create and switch
git switch - # Switch to previous branch
git switch is clearer about branch operations.
Disable the warning (not recommended):
``bash
git config advice.detachedHead false
Better to keep the warning as a reminder.
Verification
Confirm you're on a branch:
``bash
git status
Should show:
``
On branch main
nothing to commit, working tree clean
Verify commits are on branch:
``bash
git log --oneline -5
Your commits should appear in the branch history.
Check branch exists:
``bash
git branch
Should list your new or existing branch.
When Detached HEAD is Intentional
Sometimes you want detached HEAD:
- Inspecting old code:
git checkout abc1234 - Running tests on specific version:
git checkout v1.0.0 - Debugging historical bug: check out where bug was introduced
- Temporary experiments you'll discard
Just remember: any commits need a branch to persist.
Prevention
Before exploring old commits:
``bash
# Create branch first if you might make changes
git checkout -b inspect-abc123 abc123
After accidentally detaching with work:
``bash
# Immediately create branch before more work
git checkout -b save-my-work
Regular reflog checks:
``bash
git reflog --date=relative
Keeps track of where you've been.
Related Articles
- [Technical troubleshooting: Fix Git Bisect Skip Marking Bad Commit Incorrectly](bisect-skip-marking-bad-incorrectly-git)
- [Technical troubleshooting: Fix Cherry Pick Range Wrong Order Git Issue in Git](cherry-pick-range-wrong-order-git)
- [Fix Credential Helper Not Storing Wsl2 Git Issue in Git](credential-helper-not-storing-wsl2-git)
- [Fix Git Filter-Branch Rewrite Breaking GPG Commit Signatures](filter-branch-rewrite-breaking-signatures-git)
- [Git Abort Rebase and Recover: Complete Guide](fix-git-abort-rebase)
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "TechArticle", "headline": "Git Detached HEAD: Complete Recovery Guide", "description": "Learn how to recover from git detached HEAD state, save your commits, create branches, and prevent losing work when checking out specific commits.", "url": "https://www.fixwikihub.com/fix-git-detached-head-state", "publisher": { "@type": "Organization", "name": "FixWikiHub", "url": "https://www.fixwikihub.com" }, "author": { "@type": "Person", "name": "FixWikiHub Editorial Team" }, "datePublished": "2025-11-13T15:50:01.708Z", "dateModified": "2025-11-13T15:50:01.708Z" } </script>