I remember a reading a while ago that CVS merge actually uses the diff3 algorithm to perform merging.
This PDF article A Formal Investigation of Diff3, by Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce from the Universtiy of Pennsylvania describes the diff3 algorithm in detail.
If focuses primarily on the properties of the merging algorithm itself, not on how it integrates with CVS.
In answer to your questions:
Tag, date awareness
From the CVS man page:
-j tag[:date] Merge in changes from revisions specified by tag or, when
date is specified and tag is a branch
tag, the version from the branch tag
as it existed on date
2 or 3 way and text/binary awareness
diff3 defaults to a plain text diff. It compares (diffs) 3 versions of the file.
From the diff3 man page:
If `diff3' thinks that any of the
files it is comparing is binary (a
non-text file), it normally reports an
error, because such comparisons are
usually not useful. As with 'diff',
you can force 'diff3' to consider all
files to be text files and compare
them line by line by using the '-a' or
'--text' options.
Base version during comparison
The base version, according to the linked article, is the last common version (O) between the two current versions of the file (A and B). It first uses the 2 way diff algorithm to find the longest common subsequences between O and A, and O and B.
Then (quoted from the article) it:
... takes the regions where O
differs from either A or B and
coalesces the ones that overlap,
leading to the alternating sequence of
stable (all replicas equal) and
unstable (one or both replicas
changed) chunks shown in Figure 1(c).3
Finally, it examines what has changed
in each chunk and decides what changes
can be propagated, as shown in Figure
1(d)—here, the second chunk is changed
only in A (by inserting 4, 5), so this
change can be propagated to B, but the
fourth chunk has changes in both A and
B, so nothing can be propagated.