Git only
Git encourages you to use branches for this kind of workflows.
Branches are very cheap in git, so you should use them extensively. What you are asking are called "topic branches", and these are nothing more than a normal branch, but dedicated to a given topic (rather than a development state).
With git you should do something like:
$ git clone ...
$ git branch
* master
$ git checkout -b taskA # Start working on task A
$ git branch
master
* taskA
$ <changes on task A>
$ git commit # This "saves" the work done on task A
$ git checkout master # Revert to the last stable state
$ git checkout -b taskB # Start working on task B
$ git branch
master
taskA
* taskB
$ <changes on task B>
$ git commit # "Save" the changes on task B
$ git checkout master # To revert to the last stable state
$ git checkout taskA # To continue working on task A
This will create a history that represents your different "workspaces" with branches:
a -> b -> c # master
\
-> d -> e # Topic A
\
-> f -> g # Topic B <- HEAD
$ git branch
master
taskA
* taskB
Once you have this history, you can merge your changes back to master (the stable branch) and then push your master branch to the central repository.
This scheme is very useful, because you can work on any topic branch without needing multiple workspaces and you can work at any given time on any given topic, always keeping your history of changes.
You can make changes to the same files in different branches, when merging a branch into another, git will try and merge the changes made to the files. If there's a conflict because you changed the exact same line on two different places, then git will notify you to solve that particular conflict.
Also, you may check git stash to see how to save temporal changes that can't be committed at the moment.
Read Branching Workflows chapter from Pro Git for more information.