CVS's big benefit over RCS is that it deals with collections of files, called modules, rather than individual files. A module is basically a single subdirectory. However, the module can logically contain another module. You can operate on any arbitrary module subtree. This means that unlike RCS, where there is a separate RCS tree per package or application, a single CVS repository can hold many different and distinct packages. I have set up /home/CVS on one of full-sail's local disks as a repository for all GloMop-related stuff.
CVS takes some getting used to, relative to RCS, because there is no concept of locking. Anyone can check out and work on a module. When changes are committed to the golden repository, most conflicts are handled transparently using rcsmerge; line-by-line conflicts prevent files from being checked in and must be resolved by hand.
Unlike RCS, in CVS the location of the "golden repository" is totally unrelated to the location of your work area where you do development. This is good, because it keeps the repository "out of the way" and you can do development wherever it's convenient. (CVS even provides a way to check files in and out across different machines, as is discussed later.)
Here's how your work session goes in CVS:
Suppose your co-worker tells you "I just made some changes to the 'foo' module, and updated the CVS tree." Here's what you would do:
The first thing you must do is set the CVSROOT environment variable to the root of the CVS repository tree, e.g. /home/CVS. (You can also say "-d pathname" with any CVS command to name the tree explicitly, but I recommend the first way.)
Congratulations, your files now live in the CVS repository. To test whether it worked, try checking out the new module.
If your application directory contains subdirectories, it's a little trickier. You need to check in each subdirectory as a submodule. For example, suppose your app lives in directory 'foo', with subdirectories 'bar' and 'baz'. You would first go into 'bar' and perform the above checkout procedure, naming the module 'foo/bar'. Then do the same for 'baz'. Finally, go up to 'foo', and check in the module named 'foo'.
This somewhat convoluted procedure has two effects:
If you're checking out over a slow network link, you can use "cvs -z 9" instead of just "cvs"; it causes gzip -9 to be run on the server and gunzip on the client automatically.
See the online manual for more.