October 28, 2009 22 Comments
Using git, you’ll sometimes find that you’re not on any branch. This usually happens when you’re using a submodule inside another project. Sometimes you’ll make some changes to this submodule, commit them and then try to push them up to a remote repository:
ed$ git commit -m "My excellent commit" [detached HEAD d2bdb98] My excellent commit 3 files changed, 3 insertions(+), 3 deletions(-) ed$ git push origin master Everything up-to-date
Er, what? Everything is not up to date – I just made changes! The clue is in the first part of the commit response – [detached HEAD d2bdb98]. This just means that we’ve made a commit without actually being on any branch.
Luckily, this is easy to solve – all we need to do is checkout the branch we should have been on and merge in that commit SHA:
ed$ git checkout master Previous HEAD position was d2bdb98... My excellent commit Switched to branch 'master' ed$ git merge d2bdb98 Updating 88f218b..d2bdb98 Fast forward ext-mvc-all-min.js | 2 +- ext-mvc-all.js | 2 +- view/FormWindow.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-)
Once we got onto the master branch, we just called git merge with the SHA reference for the commit we just made (d2bd98), which applied our commit to the master branch. The output tells us that the commit was applied, and now we can push up to our remote repository as normal:
ed$ git push origin master Counting objects: 11, done. Delta compression using up to 2 threads. Compressing objects: 100% (6/6), done. Writing objects: 100% (6/6), 692 bytes, done. Total 6 (delta 4), reused 0 (delta 0) To firstname.lastname@example.org:extmvc/extmvc.git 88f218b..d2bdb98 master -> master
This had me puzzled for a while so hopefully it’ll save someone banging their head against a nearby wall.