I’ve been using subversion/svn for a while now (BTW if you use it, choose FSFS for storage type and DAV for connectivity). It’s pretty okay (way better than CVS, at least) as long as you’re working online and the only one accessing the repository ;) For distributed development (such as with the Linux kernel) it’s less suitable though. Particularly merging conflicting revisions kind of “sucks”. Monotone promises to bring improvements in this field (monotone FAQ):
How do you merge versions?
The merging system is based on a pair of 3-way merges: one set-oriented one at the changeset level to resolve differences in tree layout, and one line-oriented one at the file level, to resolve differences in concurrent edits to the same file. If either of these fail, they are passed off to a user-provided hook function, which invokes emacs ediff mode by default (but can be overridden).
It is important to note that a 3-way merge is not the same as simply “applying patches” in one order or another: we locate the least common ancestor of the merged children in our ancestry graph, calculate the edits on the left and right edges, adjust the right edge’s edit coordinates based on the left edge’s edits, and only then do we concatenate the left and right edges (ignoring identical changes, and rejecting conflicting ones).
A few reasons:
- We don’t see how Codeville’s algorithm achieves anything beyond
what we currently do, though we’ll happily listen to explanations.
- Darcs algorithm is based on patch commuting, which requires a
fundamentally different representation of versions than ours.
- Arch’s merges are based on applying patches in various orders.
While better suited to cherry-picking, only one of them (star-merge)
seems to provide a 3-way merge; the other two are strictly weaker.
- In general, we’re afraid of hitting patents. We don’t know exactly what’s
patented in this field, but so far the 3-way merge has served well.
If you find a better, free merge operator, please let us know!
Hopefully, there will be more choice regarding monotone’s frontends and IDE integration soon.
BitKeeper would be the VCS of choice for me. Unfortunately, it will be closed source software exclusively soon. Due to BK’s high price tag, a commercial license (or leasing) of BK is not an option at the moment.
BTW. Surprisingly, there’s a whole bunch of other interesting VCS projects (most of which I didn’t know).
1. monotone is available in Gentoo’s Portage tree, ready to be installed (IOW stable) :)
2. svk looks interesting too (particularly if you use svn already). Gentoo ebuilds for svk are masked currently.