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

Koneenpiirustuksessa versiohallinta on ollut normaali menettelytapa jo vuosikymmeniä.

Versiohallinta tietotekniikassa
-------------------------------

*Laajempi esitys artikkelissa Ohjelmiston versiohallinta*
Tietotekniikassa versiohallintaa käytetään yleisesti ohjelmistoja kehitettäessä. Hyvän toimintatavan mukaan lähdekoodi pyritään pitämään versiohallinnassa, jossa muilla kehittäjillä on siihen pääsy ja päällekkäisten muutosten mahdollisuus vähenee.*lähde?* Ohjelmiston versiohallinta tallentaa myös tiedostojen aikaleiman ja tiedoston tallentajan nimen, joka on tärkeää jo tietoturvankin kannalta. Versiohallinnassa voidaan määrittää tietty versio ohjelmasta koostuvaksi tiettyjen tiedostojen tietyistä versiosta, ja kehittää eri versioita rinnan.

Suuremmissa järjestelmissä on yleistä pitää myös konfiguraatiotiedostoja versiohallinnassa, jolloin muutoksia ja niiden tekijöitä voidaan seurata.

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

Versionhallintajärjestelmät
---------------------------

*Pääartikkeli: Luettelo versionhallintajärjestelmistä*
SCCS vuodelta 1972 on yksi ensimmäisistä järjestelmistä.

Versionhallintajärjestelmät voidaan jakaa kolmeen sukupolveen seuraavasti:

1. yksittäiset tiedostot, ei verkottamista: RCS, SCCS
2. useampia tiedostoja, keskitetyt palvelimet: CVS, Subversion
3. 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* (engl. *changeset*), 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 (engl. *merge*) ja muutosten tallettamien (engl. *commit*) ovat erillisiä toimintavaiheita. Rinnakkaisuusmalli sallii tallettaa muutokset ensin ja päättää jälkikäteen yhdistämisestä.

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)

Katso myös
----------

* DeltaV
* Metatieto
* Hajautettu versionhallintajärjestelmä

Lähteet
-------

1. 1 2 3 4  Eric Sink: A History of Version Control *ericsink.com*. Viitattu 23.2.2017. (englanniksi)
2. ↑  Eric Sink: Chapter 1. Introduction *ericsink.com*. Viitattu 3.11.2019. (englanniksi)
3. ↑  Chapter 1. How did we get here? *hgbook.red-bean.com*. Viitattu 3.11.2019. (englanniksi)

Aiheesta muualla
----------------

* Kuvia tai muita tiedostoja aiheesta **Versiohallinta** Wikimedia Commonsissa