We can group version control systems into roughly three generations:
- The first generation (1972-1982) was file-centric and local. Part I: First-generation
- The second generation was client-server (1982-2003) – with both lock and merge-based concurrency models. Part II: Client/Server
- The third generation was distributed version control (2003-present) – full history stored on every peer, with a merge-based concurrency model. Part III: Distributed
The first generation might be called local version control. Each file was tracked separately and given revision numbers like
1.3. Branches were possible, but they looked like
1.2.2. Since each file had its own version, your project might have used
1.2 of file A and
1.5.6 of file B.
First-generation version control systems made collaboration possible, but it was painful. Deleting, renaming, or creating new files wasn't easily done. Tracking files across multiple directories as part of one project was impossible. Branching and merging were confusing. Locks worked by copying a file with read-only or read-write UNIX permissions. Inevitably, programmers didn't want to wait for someone else to finish editing, so they got around the lock system with a simple
The two widely used first-generation version control systems were SCCS and RCS.
Source Code Control System (SCCS) – 1972. Designed at Bell Labs in 1972 for the IBM System/370. SCCS kept track of the source code and deltas in the same file. SCCS used interleaved deltas, described by a header that determines which blocks correspond to which revisions. Any revision could be checked out in one pass, although the generation time for each revision was the same. Checking out old code took just as long as checking out today's code. That led SCCS to have the reputation,
Where source code checks in, but doesn't check out
Revision Control System (RCS) – 1982. What if the system kept track of reverse-deltas instead of forward-deltas? Then, checking out the latest revision would be a quick operation (at the expense of old versions). That was one key insight in RCS. RCS was largely built on the ideas of SCCS (the latter is mentioned often in the RCS paper).
Next: Part II: Client/Server