Changes should be committed to the CVS HEAD only when they are in a working state. The definition of "working" is somewhat liquid; a good guiding principle is that anyone checking out HEAD should receive a checkout of working software. When you want to work on changes that are likely to temporarily break large swathes of code, you should probably work on a private branch. Since CVS branching and merging is something of a black art, here are some simple step-by-step instructions for creating and using a branch. To create your private branch: # Get most up-to-date tree before branching cvs update # Create a branch called "my-branch" cvs tag -b my-branch # Switch working copy to the "my-branch" branch cvs update -r my-branch At this point you'll be on a branch called "my-branch". Any changes you make will not affect people working on HEAD, or on other branches. Use name for your branch that is both descriptive and unique. Starting the branch name with your SourceForge username (e.g. "mcb30-realmode-redesign") is a good idea. When you want to merge the changes on your branch back into HEAD, do the following: # Ensure there are no not-yet-checked-in modifications in your tree) cvs -q update # Tag the merge point in the "my-branch" branch cvs tag -c my-branch-merge-1 # Switch working copy back to HEAD cvs update -A # Merge changes from the branch cvs update -j my-branch # Commit merged changes to HEAD cvs commit If you then want to continue working further on the "my-branch" branch, do the following # Switch working copy back to the "my-branch" branch cvs update -r my-branch and then when you want to merge some more changes back to HEAD: # Ensure there are no not-yet-checked-in modifications in your tree) cvs -q update # Tag the merge point in the "my-branch" branch cvs tag -c my-branch-merge-2 # Switch working copy back to HEAD cvs update -A # Merge changes from the branch cvs update -j my-branch-merge-1 -j my-branch # Commit merged changes to HEAD cvs commit Note that the format of the "merge changes from the branch" command has changed, because this time you need to only merge changes since the last merge point. When you have finished with your branch and merged all the changes back to HEAD, simply stop using the branch.