Go to the first, previous, next, last section, table of contents.

## Tags--Symbolic revisions

The revision numbers live a life of their own. They need not have anything at all to do with the release numbers of your software product. Depending on how you use CVS the revision numbers might change several times between two releases. As an example, some of the source files that make up RCS 5.6 have the following revision numbers:

    ci.c            5.21
    co.c            5.9
    ident.c         5.3
    rcs.c           5.12
    rcsbase.h       5.11
    rcsdiff.c       5.10
    rcsedit.c       5.11
    rcsfcmp.c       5.9
    rcsgen.c        5.10
    rcslex.c        5.11
    rcsmap.c        5.2
    rcsutil.c       5.10

You can use the `tag` command to give a symbolic name to a certain revision of a file. You can use the ``-v'` flag to the `status` command to see all tags that a file has, and which revision numbers they represent. Tag names can contain uppercase and lowercase letters, digits, ``-'`, and ``_'`. The two tag names `BASE` and `HEAD` are reserved for use by CVS. It is expected that future names which are special to CVS will contain characters such as ``%'` or ``='`, rather than being named analogously to `BASE` and `HEAD`, to avoid conflicts with actual tag names.

The following example shows how you can add a tag to a file. The commands must be issued inside your working copy of the module. That is, you should issue the command in the directory where ``backend.c'` resides.

    $ cvs tag release-0-4 backend.c
    T backend.c
    $ cvs status -v backend.c
    ===================================================================
    File: backend.c         Status: Up-to-date

        Version:            1.4     Tue Dec  1 14:39:01 1992
        RCS Version:        1.4     /usr/local/cvsroot/yoyodyne/tc/backend.c,v
        Sticky Tag:         (none)
        Sticky Date:        (none)
        Sticky Options:     (none)

        Existing Tags:
            release-0-4                     (revision: 1.4)

There is seldom reason to tag a file in isolation. A more common use is to tag all the files that constitute a module with the same tag at strategic points in the development life-cycle, such as when a release is made.

    $ cvs tag release-1-0 .
    cvs tag: Tagging .
    T Makefile
    T backend.c
    T driver.c
    T frontend.c
    T parser.c

(When you give CVS a directory as argument, it generally applies the operation to all the files in that directory, and (recursively), to any subdirectories that it may contain. See section Recursive behavior.)

The `checkout` command has a flag, ``-r'`, that lets you check out a certain revision of a module. This flag makes it easy to retrieve the sources that make up release 1.0 of the module ``tc'` at any time in the future:

    $ cvs checkout -r release-1-0 tc

This is useful, for instance, if someone claims that there is a bug in that release, but you cannot find the bug in the current working copy.

You can also check out a module as it was at any given date. See section checkout options.

When you tag more than one file with the same tag you can think about the tag as "a curve drawn through a matrix of filename vs. revision number." Say we have 5 files with the following revisions:

            file1   file2   file3   file4   file5

            1.1     1.1     1.1     1.1  /--1.1*      <-*-  TAG
            1.2*-   1.2     1.2    -1.2*-
            1.3  \- 1.3*-   1.3   / 1.3
            1.4          \  1.4  /  1.4
                          \-1.5*-   1.5
                            1.6

At some time in the past, the `*` versions were tagged. You can think of the tag as a handle attached to the curve drawn through the tagged revisions. When you pull on the handle, you get all the tagged revisions. Another way to look at it is that you "sight" through a set of revisions that is "flat" along the tagged revisions, like this:

            file1   file2   file3   file4   file5

                            1.1
                            1.2
                    1.1     1.3                       _
            1.1     1.2     1.4     1.1              /
            1.2*----1.3*----1.5*----1.2*----1.1     (--- <--- Look here
            1.3             1.6     1.3              \_
            1.4                     1.4
                                    1.5

Go to the first, previous, next, last section, table of contents.