# Versiebeheersysteem

Een versiebeheersysteem of VCS (Engels: Version Control System) is een computerprogramma of een verzameling programma's waarmee men de wijzigingen in documenten, programma's of andere informatie bewaard in computerbestanden kan beheren. Een VCS wordt het meest gebruikt bij de ontwikkeling van software, als onderdeel van het releasemanagementproces, zodat meerdere mensen wijzigingen kunnen aanbrengen aan dezelfde bestanden. Wijzigingen worden meestal aangeduid met een code, het "revisienummer" of "revisieniveau". Elke wijziging wordt gekoppeld aan een timestamp en aan de persoon die de wijziging maakte. Wijzigingen kunnen vergeleken worden, hersteld en soms samengevoegd.
Een versiebeheersysteem is meestal een apart programma, maar het is ook in beperkte mate ingebouwd in sommige software zoals tekstverwerkers (bijvoorbeeld Microsoft Word, LibreOffice Writer, KOffice, Pages, Google Docs), spreadsheets (bijvoorbeeld LibreOffice Calc, Google Spreadsheets, Microsoft Excel), en in verschillende CMS Systemen. Het is ook een kenmerk van wiki-software, zodat wijzigingen altijd teruggedraaid kunnen worden, bijvoorbeeld bij vandalisme.

## Gebruik

Een computerprogramma bijvoorbeeld is meestal te complex om in één keer te schrijven. Vaak gaat er enige tijd voorbij voordat het af is (van dagen tot jaren), en zelfs als het af verklaard wordt, gaat de maker vaak verder met een volgende, betere versie van het programma.
Een versiebeheersysteem bewaart voldoende informatie om oudere versies te kunnen terugvinden. Ook kan er voor elke wijziging een omschrijving van die wijziging (bv. de reden) bewaard worden. Wijzigingen die later problemen blijken te veroorzaken kunnen er gemakkelijk mee ongedaan worden gemaakt.
Sommige versiebeheersystemen staan ook toe om verschillende versies van hetzelfde programma tegelijk te beheren. Zo kan de maker zowel aan de nieuwe versie werken als fouten uit de oude versie halen. (Dergelijke hoofdversies heten releases, vrijgaves).

## Werking

Over het algemeen werkt een VCS met een van de volgende twee methoden.
* vergrendelen - bewerken - ontgrendelen
* kopiëren - bewerken - samenvoegen

### Vergrendelen - Bewerken - Ontgrendelen

Bij de eerste methode wordt een bestand exclusief toegewezen aan een bepaalde ontwikkelaar, andere ontwikkelaars kunnen niet tegelijkertijd aan dezelfde broncode werken. Als de ontwikkelaar klaar is met het aanbrengen van wijzigingen wordt de broncode weer vrijgegeven voor anderen.

### Kopiëren - Bewerken - Samenvoegen

Vaak werken meerdere mensen tegelijkertijd aan één bestand. Sommige versiebeheersystemen staan daarom toe dat meerdere mensen hetzelfde bestand tegelijkertijd kunnen bewerken. Bij het terugzetten van de wijzigingen in het VCS wordt gecontroleerd of wijzigingen elkaar overlappen. In dat geval moet er handmatig gekozen worden hoe de wijzigingen toch beide kunnen worden doorgevoerd.

## Terminologie
### Baseline

    Over het algemeen is dit een set van bestanden met dezelfde tag, die gebruikt kan worden als basis voor verdere ontwikkelingen.

### Branch

    Een verzameling van bestanden in de repository kunnen worden branched of forked op een bepaald moment, zodat vanaf dat moment er twee versie van dezelfde bestanden aanwezig zijn in de repository. Hierdoor kunnen twee verschillende versies van een systeem tegelijkertijd worden aangepast.

### Change

    Een change (of diff of delta) is een bepaalde wijziging op een bestand dat onderdeel is van de repository. De granulariteit van wat een change precies is verschilt van systeem tot systeem

### Check-out

    Een check-out (of checkout of co) maakt een working-copy aan. Een check-out zorgt voor het kopiëren van een bepaalde of de meest recente versie van de bestanden

### Commit

    Een commit of check-in is de actie waarbij een kopie van de veranderingen die zijn aangebracht in de working-copy in de repository wordt vastgelegd.

### Conflict

    Een conflict treedt op als twee wijzigingen samenvallen. Afhankelijk van het soort systeem kan dit gaan over een bestand of een deel van een bestand. Vaak moet een gebruiker aangeven wat er met de beide wijzigingen moet gebeuren

### Export

    Een export is gelijk aan een check-out, behalve dat er geen meta data wordt meegestuurd over versies. Dit is het tegengestelde van een import

### Import

    Een import is het in de repository zetten van bestanden die daar nog geen onderdeel van uitmaakten.

### Merge

    Een merge of integration zorgt voor het toepassen van meerdere wijzigingen op hetzelfde bestand..
   * Dit kan gebeuren als één gebruiker, die zijn lokale working-copy bepaalde bestanden heeft aangepast, de wijzigingen aanbrengt in de repository, terwijl deze bestanden ook zijn aangepast door één of meer andere gebruikers.
   * Als er een branch is gemaakt en er een probleem wordt opgelost dat in beide versie bestaat, dan wordt de oplossing vaak in één branch aangebracht en wordt dit bestand weer gemerged met de andere branch.
   * Een merge kan ook optreden als twee (of meer) branches weer worden samengevoegd tot één branch.

### Tag

    Een tag of release markeert een belangrijke momentopname op een bepaald moment. Over het algemeen wordt op deze manier een bepaalde versie gemarkeerd.

### Repository

    De repository is de plaats waar de bestanden en de informatie over de historie van de bestanden wordt bewaard.

### Resolve

    Het oplossen van een conflict door een gebruiker.

### Revision

    Een revision of version is één versie in een keten van aanpassingen.

### Trunk

    Een unieke verzameling van bestanden in de repository. (ook wel: Baseline, Mainline of Master)

### Update

    Een update (of sync) brengt de wijzigingen die in de repository zijn aangebracht ook aan in de lokale working copy.

### Working copy

    De working copy is een lokale kopie van bestanden uit de repository,van een bepaalde datum of revisie. Dit zijn de bestanden waar de gebruiker de wijzigingen in aanbrengt, vandaar de naam.

## Bekende versiebeheersystemen

Bekende versiebeheersystemen zijn:
* Aegis
* Bazaar
* BitKeeper
* Concurrent Versions System ofwel CVS
* Git
* Harvest Change Manager
* Katie
* Mercurial
* Rational Clearcase
* Revision Control System ofwel RCS
* Source Code Control System ofwel SCCS
* Subversion
* Team Foundation Version Control
* Telelogic Synergy (voorheen Continuus)
* Visual Source Safe