Each changeset contains enough information to reconstruct the entire tree as of that changeset. It is as if you tagged the tree every time you made a change. Although other tools allow tagging, the way that they are implemented prevents people from using the feature often since it is usually a very time consuming task on a large tree. This is invaluable for a code reorganization, and something neither CVS nor Perforce supports. When you want to make changes, you check out a work area which is just the clear files without the revision history.
Parallel development is enabled by allowing multiple work areas based on the same repository.
Since each work area in BitKeeper is itself a repository, the single layer model is no longer required. In the single repository model, if anyone checks in a bad change to the tree, then everyone will be effected by that change the next time they sync up. Putting a staging area between a group and the rest of the world allows changes to be debugged within a local group, without breaking the one shared repository. This is very helpful when a large development team of many groups is trying to do one large software release. BitKeeper remembers the state of the tree as changesets, so when you synchronize any two trees, all BitKeeper has to do is compare a summary of the ChangeSet file.