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

## Conflicts example

Suppose revision 1.4 of ``driver.c'` contains this:

    #include <stdio.h>

    void main()
    {
        parse();
        if (nerr == 0)
            gencode();
        else
            fprintf(stderr, "No code generated.\n");
        exit(nerr == 0 ? 0 : 1);
    }

Revision 1.6 of ``driver.c'` contains this:

    #include <stdio.h>

    int main(int argc,
             char **argv)
    {
        parse();
        if (argc != 1)
        {
            fprintf(stderr, "tc: No args expected.\n");
            exit(1);
        }
        if (nerr == 0)
            gencode();
        else
            fprintf(stderr, "No code generated.\n");
        exit(!!nerr);
    }

Your working copy of ``driver.c'`, based on revision 1.4, contains this before you run ``cvs update'`:

    #include <stdlib.h>
    #include <stdio.h>

    void main()
    {
        init_scanner();
        parse();
        if (nerr == 0)
            gencode();
        else
            fprintf(stderr, "No code generated.\n");
        exit(nerr == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
    }

You run ``cvs update'`:

    $ cvs update driver.c
    RCS file: /usr/local/cvsroot/yoyodyne/tc/driver.c,v
    retrieving revision 1.4
    retrieving revision 1.6
    Merging differences between 1.4 and 1.6 into driver.c
    rcsmerge warning: overlaps during merge
    cvs update: conflicts found in driver.c
    C driver.c

CVS tells you that there were some conflicts. Your original working file is saved unmodified in ``.#driver.c.1.4'`. The new version of ``driver.c'` contains this:

    #include <stdlib.h>
    #include <stdio.h>

    int main(int argc,
             char **argv)
    {
        init_scanner();
        parse();
        if (argc != 1)
        {
            fprintf(stderr, "tc: No args expected.\n");
            exit(1);
        }
        if (nerr == 0)
            gencode();
        else
            fprintf(stderr, "No code generated.\n");
    <<<<<<< driver.c
        exit(nerr == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
    =======
        exit(!!nerr);
    >>>>>>> 1.6
    }

Note how all non-overlapping modifications are incorporated in your working copy, and that the overlapping section is clearly marked with ``<<<<<<<'`, ``======='` and ``>>>>>>>'`.

You resolve the conflict by editing the file, removing the markers and the erroneous line. Suppose you end up with this file:

    #include <stdlib.h>
    #include <stdio.h>

    int main(int argc,
             char **argv)
    {
        init_scanner();
        parse();
        if (argc != 1)
        {
            fprintf(stderr, "tc: No args expected.\n");
            exit(1);
        }
        if (nerr == 0)
            gencode();
        else
            fprintf(stderr, "No code generated.\n");
        exit(nerr == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
    }

You can now go ahead and commit this as revision 1.7.

    $ cvs commit -m "Initialize scanner. Use symbolic exit values." driver.c
    Checking in driver.c;
    /usr/local/cvsroot/yoyodyne/tc/driver.c,v  <--  driver.c
    new revision: 1.7; previous revision: 1.6
    done

For your protection, CVS will refuse to check in a file if a conflict occurred and you have not resolved the conflict. Currently to resolve a conflict, you must change the timestamp on the file, and must also insure that the file contains no conflict markers. If your file legitimately contains conflict markers (that is, occurrences of ``>>>>>>> '` at the start of a line that don't mark a conflict), then CVS has trouble handling this and you need to start hacking on the `CVS/Entries` file or other such workarounds.

If you use release 1.04 or later of pcl-cvs (a GNU Emacs front-end for CVS) you can use an Emacs package called emerge to help you resolve conflicts. See the documentation for pcl-cvs.

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