When you work with Git submodules, the state of your submodules is going to be detached HEAD by default.
When you run git submodule update
, whether it's the first time or a new commit has been pushed by someone else for the submodules, Git will checkout the sha1 that the root project says that submodule should be at.
E.g.
> git submodule update
> cd <submodule>
> git status
HEAD detached at 59fe3c5232
nothing to commit, working directory clean
Now, I can see more information by using git log
:
> git log --all --decorate --graph --format=oneline
* 59fe3c5232 (HEAD, origin/master, master) Commit details
* 8762eca8d9 Older commit
...
When there are branches, that log will be more interesting: look for HEAD
to see where you're at.
With my example, if I now do git checkout master
inside the submodule, I'm still on the commit expected by the root repo, but I'm tracking the master branch inside the submodule too.
> git checkout master
> git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
But if I were to checkout a commit that was not what the root repo expected, then the root repo would consider that a change that needs to be committed. (Do git diff
or git status
in the root repo to see that.)
If someone else on the team pushes a commit to the submodule, the next time I update the root repo and do git submodule update
, I'll end up back in detached head mode.
I only bother to checkout a branch in the submodule if I'm actually working on that submodule.