What I would do is this. First, I would do a "git stash".
Use git stash when you want to record the current state of the working directory and the index, but want to go back to a clean working directory. The command saves your local modifications away and reverts the working directory to match the HEAD commit.
The modifications stashed away by this command can be listed with git stash list, inspected with git stash show, and restored (potentially on top of a different commit) with git stash apply. Calling git stash without any arguments is equivalent to git stash save. A stash is by default listed as "WIP on branchname …", but you can give a more descriptive message on the command line when you create one.
The latest stash you created is stored in refs/stash; older stashes are found in the reflog of this reference and can be named using the usual reflog syntax (e.g. stash@{0} is the most recently created stash, stash@{1} is the one before it, stash@{2.hours.ago} is also possible).
Do a "git status" to find out what is staged to be committed (i.e. is in the index). For each program which is staged in the index which you don't want (a "git add" has been done but not yet committed), do a "git reset HEAD file" to remove the changed, but not committed, file from the index. This does not affect the contents of the file in the working directory (it goes to untracked). When a "git status" shows only the files what you want to commit in the section with the heading: "Changes to be committed:", you can do the "git commit"
followed by a "git push". To get back to where you were, do a "git stash pop".