Versionhallinta

**Versionhallinta** () on tekniikka, jolla pidetään kirjaa tiedostoihin (ja joskus myös paperiasiakirjoihin) tehdyistä muutoksista ja säilötään niiden vanhemmat versiot. Versionhallinnan kohteina voivat olla esimerkiksi CAD-piirustukset, erilaiset dokumentit tai ohjelmoinnissa lähdekoodi.

Lähdekoodin hallinnalla () viitataan usein versiohallintaan.

Koneenpiirustuksessa versiohallinta on ollut normaali menettelytapa vuosikymmeniä.

## Versionhallinta tietotekniikassa
Tietotekniikassa versiohallintaa käytetään yleisesti ohjelmistoja kehitettäessä. Ilman versionhallintaa on vaikeaa seurata eri kehittäjien tekemiä muutoksia ja ristiriitojen havaitseminen on vaikeampaa. Versionhallinnan sivuvaikutusta sanotaan *passiiviseksi kommunikaatioksi*, jolloin koko kehittäjäryhmä voi seurata etenemistä ja tarvittaessa palata taaksepäin. Merkittävä etu on tarvittavan viestinnän väheneminen ja päällekkäisyydet voidaan käsitellä ennen julkaisua.

Versionhallintajärjestelmä tallentaa tiedostojen sisällön lisäksi luomiset ja poistamiset sekä uudelleen nimeämiset. Muutoksista tallennetaan tekijä, ajanhetki sekä muutokseen liittyviä merkintöjä ja huomioita kuten perustelut muutoksen tekemiselle.

Useissa avoimen lähdekoodin ohjelmistoprojekteissa versiohallinta on yleisesti myös kehittäjäryhmän ulkopuolelta luettavissa, jolloin käyttäjillä on mahdollisuus noutaa välittömästi uusimmat muutokset ja osallistua ohjelman kehittämiseen.

## Versionhallintajärjestelmät
SCCS on yksi ensimmäisistä nimenomaan lähdekoodin hallintaan tarkoitetuista järjestelmistä.

Versionhallintajärjestelmät voidaan jakaa kolmeen sukupolveen seuraavasti:
# yksittäiset tiedostot, ei verkottamista: RCS, SCCS
# useampia tiedostoja, keskitetyt palvelimet: CVS, Subversion
# muutosjoukkoja, hajautetut palvelimet: Git, GNU Bazaar, Mercurial

Ensimmäisen sukupolven versiohallintajärjestelmät käsittelivät tiedostoja yksi kerrallaan. Rinnakkaisuusmalli perustui lukituksiin, jolloin vain yksi henkilö pystyi muokkaamaan tiedostoa kerrallaan.

Toinen sukupolvi osaa käsitellä useampia tiedostoja ja tukee verkottumista. Rinnakkaisuusmalli perustui muutoksien yhdistämiseen ennen tallettamista.

Kolmas sukupolvi tukee *muutosjoukkoja* (), jossa muutokset ovat jakamattomia useamman tiedoston kattavia muutoksia: tietty muutos voi vaatia muutoksen useampaan tiedostoon yhtä aikaa eikä ole sallittua jakaa eri päivityksiin. Muutosten yhdistäminen () ja muutosten tallettamien () ovat erillisiä toimintavaiheita. Rinnakkaisuusmalli sallii tallettaa muutokset ensin ja päättää jälkikäteen yhdistämisestä. Git seuraa *tilannekuvia* (), joka eroaa varhaisien järjestelmien tavasta seurata tehtyjä tiedostokohtaisia muutoksia (*delta*).

Versionhallintajärjestelmien tavoitteita ovat:
* mahdollistaa ihmisten työskentely samanaikaisesti, ei vuorotellen
* kun useampi ihminen työskentelee samanaikaisesti, muutosten ei pitäisi aiheuttaa konflikteja
* halutaan säilöä kaikki versiot kaikesta (mikä muutos oli, kuka teki, milloin ja miksi)

## Konfiguraationhallinta
Ohjelmiston konfiguraationhallinta (, SCM) sisältää myös muuta metatietoa ja käytetään lähdekoodin versionhallinnan rinnalla. Laajemmin konfiguraationhallinta sisältää tuotteen elinkaaren aikaiset ominaisuudet.

## Katso myös

* DeltaV
* Metatieto
* Hajautettu versionhallintajärjestelmä

## Lähteet

## Aiheesta muualla