A quick explanation of FreeBSD release versions

With the exception of this introduction, this page is not my own.

The question frequently comes up on both mailing lists and forums asking for clarification about the differences between CURRENT, STABLE and RELEASE. With FreeBSD 4.x, 5.x and 6.x all being used these days, there seems to be a lot of confusion.

Freddie Cash has written a very clear explanation of the differences. He has kindly given me permission to post it here.

So, with thanks to Freddie, here it is.

-CURRENT is the development tree that will eventually become the next major version of FreeBSD. The developers try to keep this tree buildable, but they can't guarantee that it will be usable. Tread lightly all those that dare run this version. You must know what you are doing, understand how to debug and rebuild, and be prepared for lost data. As I write, this is known as 7-CURRENT, which will one day become FreeBSD 7.0. The cvsup tag for CURRENT is . (the period).

Programming APIs and ABIs, as well as library versions, will change without much warning, breaking many installed ports.

-STABLE is the development tree for the latest release(s) of FreeBSD. After every release is branched from the -CURRENT tree, it becomes the -STABLE tree. As of mid 2006, there are three of these: 4-STABLE, 5-STABLE, and 6-STABLE. These are development trees, but they tend to be more usable than the -CURRENT tree, as there are more stringent tests and rules on what gets placed in these trees. Sometimes, it can be advantageous to run -STABLE, especially if you need specific driver support or a specific bug fix. It's not always guaranteed to work, though, so be prepared. cvsup tags are: RELENG_4, RELENG_5, and RELENG_6.

NOTE: -STABLE refers to the programming API/ABI used by the kernel and base applications and libraries. It doesn't refer to the stability of the running code. IOW, developers can write applications and drivers for 6.0 and that same binary and driver will work on 6.9 (with occasional exceptions.) This does not mean that the code quality is poor, as it is not, but it is not the primary meaning of -STABLE.

This is contrary to the Linux world, where "stable" means stable running code and not stable programming APIs/ABIs (which can change on a weekly basis, even in releases.) Then there are the releases which are (in essence) just snapshots of the -STABLE tree at a specific point in time, that get a lot of testing, and are released to the public as a fully-usable OS. At time of writing, the latest releases are: 4.11, 5.4, and 6.0. The cvsup tags for these are:
RELENG_4_11_0_RELEASE, RELENG_5_4_0_RELEASE, and RELENG_6_0_0_RELEASE. These are what are on the installation CDs.

Finally, there are the security branches. These are the release branches + major bug fixes + security fixes. These are the recommended branches for all users to be running. The version numbers for these all end in -pX where X is some number that gets incremented with each bug/security fix, for example, 5.4-p4.

The cvsup tags for these are: RELENG_X_Y where X is the major release number (4, 5, or 6), and Y is the minor release number. For instance, RELENG_4_11 for version 4.11, RELENG_5_4 for version 5.4, and RELENG_6_0 for version 6.0. Just remember, -CURRENT and -STABLE are development trees and should only be used if you are a developer, tester, very brave, and know what you are doing. The security branches are what you should be running.