How do I fix a Git detached head?
Categories:
How to Fix a Git Detached HEAD State

Understand what a Git detached HEAD is, why it happens, and learn practical steps to recover your work and reattach your HEAD to a branch.
A 'detached HEAD' state in Git can be a source of confusion for many developers. It occurs when your HEAD
reference points directly to a commit hash instead of a symbolic reference like a branch name. While not inherently dangerous, working in a detached HEAD state means that any new commits you make will not belong to any branch, making them susceptible to garbage collection if not properly handled. This article will demystify the detached HEAD state, explain its causes, and provide clear, actionable steps to fix it and safeguard your work.
Understanding the Detached HEAD State
In Git, HEAD
is a symbolic reference to the commit you are currently working on. Most of the time, HEAD
points to a branch (e.g., refs/heads/main
), and that branch, in turn, points to the latest commit in its history. When you make a new commit, the branch reference moves forward to include your new commit.
A detached HEAD state means HEAD
is pointing directly to a commit hash. This often happens when you check out a specific commit, a tag, or a remote branch's commit directly (e.g., git checkout <commit-hash>
). In this state, Git allows you to inspect the repository at that specific point in time. However, if you create new commits while in this state, those commits will exist 'off-branch' and won't be part of any named branch. This can lead to them being lost if you switch back to a branch without first saving your work.
flowchart LR subgraph Normal State A[HEAD] --> B(main) B --> C[Commit 3] C --> D[Commit 2] D --> E[Commit 1] end subgraph Detached HEAD State F[HEAD] --> G[Commit 2] G --> H[Commit 1] I[main] --> J[Commit 3] J --> G end style A fill:#f9f,stroke:#333,stroke-width:2px style F fill:#f9f,stroke:#333,stroke-width:2px style B fill:#ccf,stroke:#333,stroke-width:2px style I fill:#ccf,stroke:#333,stroke-width:2px style C fill:#afa,stroke:#333,stroke-width:2px style D fill:#afa,stroke:#333,stroke-width:2px style E fill:#afa,stroke:#333,stroke-width:2px style G fill:#afa,stroke:#333,stroke-width:2px style H fill:#afa,stroke:#333,stroke-width:2px style J fill:#afa,stroke:#333,stroke-width:2px
Comparison of a normal Git state versus a detached HEAD state.
Common Causes of a Detached HEAD
A detached HEAD state isn't always a problem; sometimes it's an intentional action for tasks like inspecting old code or debugging. Here are the most common scenarios that lead to it:
- Checking out a specific commit: When you use
git checkout <commit-hash>
, Git movesHEAD
directly to that commit. - Checking out a tag: Tags are static pointers to specific commits.
git checkout <tag-name>
will also result in a detached HEAD. - Checking out a remote branch directly: If you
git checkout origin/main
(instead ofgit checkout main
), you're checking out the remote tracking branch, which is essentially a pointer to a commit, not a local branch you can commit to. - Using
git rebase --onto
orgit cherry-pick
without a target branch: While less common for beginners, certain advanced Git commands can temporarily put you in a detached HEAD state.
git status
. If you're in a detached HEAD state, Git will explicitly tell you, often with a message like HEAD detached at <commit-hash>
.How to Fix a Detached HEAD and Save Your Work
If you find yourself in a detached HEAD state and have made new commits you want to keep, don't panic! Git provides straightforward ways to recover. The key is to create a new branch to point to your new commits before switching back to your main development branch.
1. Step 1: Identify Your Current Commit
First, ensure you know which commit your HEAD
is currently pointing to. You can use git log
or git status
.
2. Step 2: Create a New Branch
If you have made new commits in the detached HEAD state that you want to preserve, create a new branch at your current HEAD
position. This will make your new commits part of a named branch.
3. Step 3: Switch to Your Desired Branch
Now that your work is safely on a new branch, you can switch back to your main development branch (e.g., main
or develop
).
4. Step 4: Merge or Rebase Your New Branch
Finally, integrate the changes from your newly created branch into your main development branch. You can either merge them or rebase them, depending on your team's workflow and preference for commit history.
# 1. Check your status (optional, but good practice)
git status
# 2. Create a new branch from your current detached HEAD
git branch new-feature-branch
# 3. Switch back to your main development branch
git checkout main
# 4. Merge your new branch into main
git merge new-feature-branch
# OR, if you prefer a linear history, rebase
# git rebase new-feature-branch
Commands to fix a detached HEAD and integrate new commits.
git checkout <your-branch-name>
to return to your branch without needing to create a new branch or merge anything.