Eddy, in git branches are lightweight not because you can switch between them in the same working copy, but because they are a cheap operation, not in the SVN sense at all, but because a branch in git is a name, and 40 hexadecimal bytes, aka the sha1 of the commit object the branch is at.

Branching is just sticking a new name to a node of your commits DAG[1]. Branches are stickers, only that. Once you know that, and it's central in git, then you'll easily understand that commit-ing is just adding a new object to the DAG, and move the sticker to that new position. Merging is just adding a new "void[2]" object that has two parents, and moving your sticker onto it. And so on …

Of course, to prevent you from shooting yourself in the foot, git high level commands ensure that the kind of moves you force your "sticker" to do are legit ones, aka ones that are moving from a position that is a parent of the new one, else you're not creating a continuous history but making up parallel worlds :)

IOW git branch new-branch basically does:

   $ git rev-parse HEAD > .git/refs/heads/new-branch

git-rev-parse HEAD is answering the sha1 of your current HEAD of course :) I bet you cannot be more lightweight than that, and no compared to that, svn branches are monsters, they require a central server :D

Notes

[1] Direct Acyclic Graph

[2] unless there is a conflict of course