http://www.gnu.org/manual/cvs/html_node/cvs_toc.html
Very good user manual, for example, its "Multiple developers" chapter contains:
Mechanisms to track who is editing files
and talks about how to unedit a file.
As a way of introducing cvs, we'll go through a typical work-session using cvs. The first thing to understand is that cvs stores all files in a centralized repository (see Chapter 2 [Repository], page 7); this section assumes that a repository is set up.
Suppose you are working on a simple compiler. The source consists of a handful of C files and a `Makefile'. The compiler is called `tc' (Trivial Compiler), and the repository is set up so that there is a module called `tc'.
The first thing you must do is to get your own working copy of the source for `tc'. For this, you use the checkout command:
$ cvs checkout tc
This will create a new directory called `tc' and populate it with the source files.
$ cd tc $ ls
CVS Makefile backend.c driver.c frontend.c parser.c
The `CVS' directory is used internally by cvs. Normally, you should not modify or remove any of the files in it.
You start your favorite editor, hack away at `backend.c', and a couple of hours later you have added an optimization pass to the compiler. A note to rcs and sccs users: There is no need to lock the files that you want to edit. See Chapter 10 [Multiple developers], page 63, for an explanation.
The checkout command can either take a module name as argument or a path name relative to $CVSROOT, as the following wdir example.
When you have checked that the compiler is still compilable you decide to make a new version of `backend.c'. This will store your new `backend.c' in the repository and make it available to anyone else who is using that same repository. $ cvs commit backend.c cvs starts an editor, to allow you to enter a log message. You type in \Added an optimiza- tion pass.", save the temporary file, and exit the editor.
The environment variable $CVSEDITOR determines which editor is started. If $CVSEDITOR is not set, then if the environment variable $EDITOR is set, it will be used. If both $CVSEDITOR and $EDITOR are not set then there is a default which will vary with your operating system, for example vi for unix or notepad for Windows NT/95.
In addition, cvs checks the $VISUAL environment variable. Opinions vary on whether this behavior is desirable and whether future releases of cvs should check $VISUAL or ignore it. You will be OK either way if you make sure that $VISUAL is either unset or set to the same thing as $EDITOR.
When cvs starts the editor, it includes a list of files which are modified. For the cvs client, this list is based on comparing the modification time of the file against the mod- ification time that the file had when it was last gotten or updated. Therefore, if a file's modification time has changed but its contents have not, it will show up as modified. The simplest way to handle this is simply not to worry about it|if you proceed with the commit cvs will detect that the contents are not modified and treat it as an unmodified file. The next update will clue cvs in to the fact that the file is unmodified, and it will reset its stored timestamp so that the file will not show up in future editor sessions.
If you want to avoid starting an editor you can specify the log message on the command line using the `-m' flag instead, like this:
$ cvs commit -m "Added an optimization pass" backend.c
Before you turn to other tasks you decide to remove your working copy of tc. One acceptable way to do that is of course
$ cd .. $ rm -r tc
but a better way is to use the release command (see Section A.15 [release], page 112):
$ cd .. $ cvs release -d tc M driver.c ? tc You have [1] altered files in this repository. Are you sure you want to release (and delete) directory `tc': n ** `release' aborted by user choice.
The release command checks that all your modifications have been committed. If history logging is enabled it also makes a note in the history file. See Section C.11 [history file], page 140.
When you use the `-d' flag with release, it also removes your working copy.
In the example above, the release command wrote a couple of lines of output. `? tc' means that the file `tc' is unknown to cvs. That is nothing to worry about: `tc' is the executable compiler, and it should not be stored in the repository. See Section C.9 [cvsignore], page 138, for information about how to make that warning go away. See Section A.15.2 [release output], page 112, for a complete explanation of all possible output from release.
`M driver.c' is more serious. It means that the file `driver.c' has been modified since it was checked out.
The release command always finishes by telling you how many modified files you have in your working copy of the sources, and then asks you for confirmation before deleting any files or making any note in the history file.
You decide to play it safe and answer 'n' when release asks for confirmation.
You do not remember modifying `driver.c', so you want to see what has happened to that file.
$ cd tc $ cvs diff driver.c
This command runs diff to compare the version of `driver.c' that you checked out with your working copy. When you see the output you remember that you added a command line option that enabled the optimization pass. You check it in, and release the module.
$ cvs commit -m "Added an optimization pass" driver.c Checking in driver.c; /usr/local/cvsroot/tc/driver.c,v <-- driver.c new revision: 1.2; previous revision: 1.1
done $ cd .. $ cvs release -d tc ? tc You have [0] altered files in this repository. Are you sure you want to release (and delete) directory `tc': y