What you want to do is accomplished with plain old branching in git.
From a nice StackOverflow answer by JaredPar:
Shelving is a way of saving all of the changes on your box without checking in. The changes are persisted on the server.
This is analogous to committing to a branch and pushing it to a server in git.
How to do it:
Let's say you're working on the "master" branch and you decide to implement feature X. You get a good start on it, but then your boss tells you that feature Y needs implemented as soon as possible. Phil in the next cube over volunteers to finish feature X while you do feature Y. Here's what you do:
Make a new branch and switch to it:
$ git checkout -b feature-x
Commit your changes:
$ git add filethatyouchanged.cc
$ git commit -m 'partial implementation of feature X'
Push it to a server that Phil can see:
$ git push origin feature-x
Go back to the master branch (which has not changed):
$ git checkout master
You might also want to proactively create a new branch for feature Y:
$ git checkout -b feature-y
Phil can now pull down your feature X work and pick up where you left off:
phil$ git fetch origin
phil$ git checkout -t origin/feature-x