How to revert a Git Submodule pointer to the commit stored in the containing repository?
You want to update your submodule so it is in sync with what the parent repository believes it should be. This is what the update command is for:
From the submodule manpage:
Update the registered submodules, i.e. clone missing submodules and checkout the commit specified in the index of the containing repository. This will make the submodules HEAD be detached unless --rebase or --merge is specified or the key submodule.$name.update is set to rebase or merge.
Run this and all should be well:
git submodule update --init
You can add the --recursive
flag as well to recurse through all submodules.
To change the commit that a submodule points to, you need to checkout that version in the submodule, then go back to the containing repo, add and commit that change.
Or, if you want the submodule to be on the version the top repo points to, do git submodule update --recursive
. Add --init
if you've just cloned.
Also, git submodule
without a submodule command will show you the commit you are pointing to. There will be a - or a + in front of the commit if it's not in sync.
If you look at a tree with a submodule in it, you can see that the submodule is marked as a commit
as opposed to the rest that are blobs or trees.
to see what a particular commit points wrt to submodules you can:
git ls-tree <some sha1, or branch, etc> Submodule/path
you can then see the commit or anything else if you like by passing that into log, etc (the git-dir
option at the git command level allows you to skip having to cd down to the submodule):
git --git-dir=Submodule/path log -1 $(<the above statement>)
Another case I just ran into is if there is an unstaged change in the submodule that you want to discard. git submodule update will not remove that change, nor will git reset --hard on the parent directory. You need to go to the submodule directory and do a git reset --hard. So if I want to fully discard unstaged changes in both my parent and submodule, I do the following:
In Parent:
git reset --hard
git submodule update
In Submodule:
git reset --hard