I checked out a commit/branch from master, and then checked out back to master and wrote something. After that, I committed it, but I ended up with a detached HEAD. Why?
Here is what I did:
- Create a new project and create git repository.
- git add
- git commit
- type some words
- git commit
- checkout to previous commit
checkout back
type some word
try to commit; it prompts there is a detached head.
IntelliJ IDEA's console shows:
17:08:58.143: cd C:\Users\jiahao\IdeaProjects\testtt\src
17:08:58.143: git init
Initialized empty Git repository in C:/Users/jiahao/IdeaProjects/testtt/src/.git/
17:09:16.331: cd C:\Users\jiahao\IdeaProjects\testtt\src
17:09:16.331: git -c core.quotepath=false add --ignore-errors -- C.java
17:09:24.407: cd C:\Users\jiahao\IdeaProjects\testtt\src
17:09:24.407: git -c core.quotepath=false commit --only -F C:\Users\jiahao\AppData\Local\Temp\git-commit-msg-0.txt -- C.java
[master (root-commit) 22d1c79] first commit
1 file changed, 6 insertions(+)
create mode 100644 C.java
17:09:38.060: cd C:\Users\jiahao\IdeaProjects\testtt\src
17:09:38.060: git -c core.quotepath=false commit --only -F C:\Users\jiahao\AppData\Local\Temp\git-commit-msg-0.txt -- C.java
[master 69084f3] second commit
1 file changed, 1 insertion(+)
17:09:44.136: cd C:\Users\jiahao\IdeaProjects\testtt\src
17:09:44.136: git -c core.quotepath=false checkout 22d1c7919eab50925411d9bbb8a9ad1575608c27
Note: checking out '22d1c7919eab50925411d9bbb8a9ad1575608c27'.
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.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
HEAD is now at 22d1c79... first commit
17:09:46.576: cd C:\Users\jiahao\IdeaProjects\testtt\src
17:09:46.576: git -c core.quotepath=false checkout 69084f344b79a48da92855d3fb633a28a672a302
Previous HEAD position was 22d1c79... first commit
HEAD is now at 69084f3... second commit
17:18:26.999: cd C:\Users\jiahao\IdeaProjects\testtt\src
17:18:26.999: git -c core.quotepath=false commit --only -F C:\Users\jiahao\AppData\Local\Temp\git-commit-msg-0.txt -- C.java
[detached HEAD 783fbf2] third commit
1 file changed, 1 insertion(+)
Problem and solution
Close inspection of the IntelliJ-IDEA log reveals the nature of the problem. After creating your first two commits, you were in the following situation:
Somehow, you checked out your first commit, which put you in detached-HEAD state:
Then, similarly, you checked out your second commit (which happened to be the tip of your master
branch). This still left you in detached-HEAD state:
You write:
I checked out a commit/branch from
master
[...]
Be careful. Checking out a commit that happens to be the tip of a branch is not equivalent to checking out that branch!
Note that HEAD
is now pointing directly to a commit, not to a branch. That is the definition of "detached HEAD". The fact that HEAD
points to the same commit as master
changes nothing about the fact that your HEAD is detached.
Some IDEs may not give you a clear indication that you are in fact in detached-HEAD state. Even git log --decorate
, for a long time, gave you no clue as to whether HEAD
was pointing to master
, or detached and pointing directly at master
's tip.
You then made a third commit, which, as expected, still left you with a detached HEAD; your master
branch still points to the second commit.
To get out of detached HEAD-state, you need to reattach HEAD
to a branch (master
, here). How depends on what you want to do. In the following, I'm assuming you have access to the Git CLI:
If you want to discard your third commit, simply run
git checkout master
and you'll end up back in this situation:
If you want to keep your third commit and make
master
point to it, rungit branch -f master HEAD
and then
git checkout master
Parting tip
Learning Git in an IDE is a recipe for disaster. I recommend you build your understanding at the command line first, and only then start using Git from within a GUI, if you feel that doing so would improve your workflow.
For recovering a detached-HEAD, you can :
git checkout master
来源:https://stackoverflow.com/questions/34987957/how-did-i-end-up-with-a-detached-head