I use SubVersion for version control.
commonly there are three directory :
trunk is use for mainline development, where developer commit source to it everyday.
it is where the latest source located. for keeping daily changes.
branch is a line of development that exists independently, but share a common history.
just like Joomla and Mambo. for keeping releases. e.g. version 1.0
tag is a snapshot of the whole project, just like a release. nobody should commit anything to it.
e.g. version 1.0.0
bugs and features are handled in trunk and then port to branch, you may take another snapshot. e.g. version 1.0.1.
if a core design or architecture change, then move to another branch. e.g. version 2.0.
this is just a concept, you should find your own which makes you comfortable.