Like others have answered, with Git you shouldn't care about non-finished code in your personal branches. However, if for some reason, you really really really don't want your unfinished work to ever touch the main repo, you can utilize Git's distributed nature!
There is a simple tool named git bundle
that can help you easily pass changes around without a central repository. First, clone the repo:
git clone https://github.com/octocat/Spoon-Knife.git working_copy_1
cd working_copy_1
make some changes and commit them to a temporary branch:
git checkout -b tmp_branch
git commit -a -m "temporary changes"
Now, bundle them changes:
git bundle create ../tmp.bundle tmp_branch
Now you have a bundle file you can mail to your new machine. How do you use it there? Let's create a new working copy:
cd ..
git clone https://github.com/octocat/Spoon-Knife.git working_copy_2
cd working_copy_2
we need to treat our bundle as another remote, so we can fetch the changes from it
git remote add tmp ../tmp.bundle
git fetch tmp
since the whole point was to transfer the changes without leaving a trace, we'll want to squash them into the working copy in order to lose the temp commit:
git merge tmp/tmp_branch --squash
and all that is left is to remove the temporary remote:
git remote remove tmp
VIOLA! The changes were transferred to the new working copy without leaving a trace of neither branch nor commit!
But really - this process is quite long and cumbersome. This is Git, not SVN - there really shouldn't be any reason not to push your personal branch to the central repo.
git stash
... ?