For larger projects, I divide the project into functional units. Each functional unit acts like a project unto itself, with its own configuration manager. The functional unit configuration manager maintains both a stable copy and a development copy. Changes from individual developers go into the development copy for testing and approval. When everything is approved, the development copy replaces the old stable copy, and the stable copy is saved on CD somewhere, probably never to be seen again (but maybe to save your life some day).
The configuration manager is treated as a single developer on the larger project, submitting code from the stable copy. The travel from developer's copy to group development copy to stable, and then up to the project's development copy (and on and on, on larger projects) is called migration.