Interesingly enough, no one's mentioned using branching yet.
Branches are a great way to keep the trunk healthy while continuously checking in whatever you're doing, broken or not. Think of it as forking off a new timeline for the code; the primary timeline (the trunk) chugs along and is always working; the branches can be any state at all without impacting the trunk.
This allows you to commit early and often without having to worry whether you've messed up someone else, and guarantees you never have a I've-gone-too-far-and-can't-reverse-this moment when developing something new, or an oh-Lord-I've-lost-a-week if your local disk should die. (It goes without saying that your repository should live somewhere that is frequently backed up!)
Once your code is working, you can merge the branch back to the trunk, and the trunk now gets your new code; new branches from the trunk now have all of the working-up-to-now code.
This is the huge appeal of git to many: it's really easy to branch and merge, making it very easy to just toss off a new branch, or even branches of branches, whenever they're needed. Even CVS can do branching and merging, though it is considerably more cumbersome.