Thoughts, stories and ideas.

Discarding changs in git and submodules

git master repo

To discard local changes in git repository

    git reset --hard

submodule repo

For submodules its a bit tricky.

  • Try updating the submodules if you think you did not make any local changes.

    git submodule update --init
  • If it doesn't work, hard reset all submodules

    git submodule foreach git reset --hard

If none of it works

It probably means there are some hidden/gitignored files lying around in submodule repository directory. For example, I was seeing this and none of the above steps helped.

[email protected]:project$ git status
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#   modified:   ReactiveCocoa (untracked content)

[email protected]$ git diff
diff --git a/ReactiveCocoa b/ReactiveCocoa
--- a/ReactiveCocoa
+++ b/ReactiveCocoa
@@ -1 +1 @@
-Subproject commit 6ce5f58a0545c69039f262eb3b08c0e0a0c2c413
+Subproject commit 6ce5f58a0545c69039f262eb3b08c0e0a0c2c413-dirty

I went ahead and inspected what was inside the ReactiveCocoa directory

[email protected]:project$ cd ReactiveCocoa/
[email protected]:ReactiveCocoa$ git status
# Not currently on any branch.
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#   .DS_Store

Turns out .DS_Store was the culprit. Deleting it fixed the annoying untracked content message right away.

[email protected]:ReactiveCocoa$ rm .DS_Store 
[email protected]:ReactiveCocoa$ cd ..
[email protected]:project$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.