A release is a snapshot of the code. Release 2.8.1 will never be modified, if needed, version 2.8.2 will be released. The snapshot is taken on a branch: release 2.8.1 is taken on branch 2.8. A branch evolves through improvements and bugs fixing.
Working with branches let us push correction releases on an old branch even if a new branch has been available. For example, if you find some major/security bugs in release 2.7.4, Piwigo team may release version 2.7.5 even if 2.8.2 has already been out for months.
When preparing a release, it has to be tested and qualified. Piwigo development team works as follows:
release x.y.zbetaN are first available. This release is designed for test by early adopters. It is obvious for the dev team that this release may contain many bugs. The purpose is to discover new features, even if still unstable…
release x.y.zRCn (n goes from 1 to… you can't know how far it can go…). Once many bugs have been corrected from the list made in releases x.y.zbetaN, dev team proposes a Release Candidate 1. Testers give the list of found bugs and after a (short) while, dev team proposes RC2. And so on.
release x.y.z (the final one) must be exactly the same than the last Release Candidate, without any known bug.