[voikko] Git- ja bzr-kokeilu

Teemu Likonen tlikonen at iki.fi
Sun Feb 17 01:35:38 EET 2008


Timo Jyrinki kirjoitti:

> 13.2.2008 Harri Pitkänen <hatapitk at iki.fi> kirjoitti:
> >  Tuttuus on varmasti svn:n paras puoli. Sitä osaavat käyttää (tai
> > ainakin oppivat nopeasti) lähes kaikki, jotka ovat koskaan
> > versionhallinnan kanssa olleet tekemisissä. Git on vähän
> > kummallisempi ja vaatii enemmän perehtymistä.
>
> Git:n varteenotettavana vaihtoehtona kannattaa harkita Bazaaria
> (bzr), josta olen kuullut paljon hyvää. Joku kuvaili sitä yhtä
> hyväksi (lähes) kuin git mutta paljon helppokäyttöisemmäksi.

Kiitos vinkistä. Olen nyt tutustunut gitin (1.5.3.7) lisäksi myös 
bzr:ään (1.1~rc1) sekä lueskellut postituslistoilta gitin ja bzr:n 
kehittäjien välisiä keskusteluja liittyen ohjelmistojen toimintaan.

Selvää ainakin on, että git on hieman aidommin hajautettu järjestelmä, 
ja sisäisesti se tuntuu toimivan kauniimmin. Tämän voi todentaa vaikka 
seuraavanlaisella esimerkillä.

Kaksi eri henkilöä, A ja B, luovat yhteisestä lähtökohdasta a oman 
haaransa. A tekee siihen muutoksen b ja B tekee muutoksen c. Muutokset 
b ja c ovat ristiriidassa keskenään eli niitä ei voi yhdistää ilman 
käsityötä.

 A   B

 a   a
 |   |
 b   c

Kun A yhdistää B:n haaran, tulee ilmoitus ristiriidasta, ja A ratkaisee 
sen käsin. Sen päätteeksi hän tekee merge-commitin m, jolloin A:n 
haarat näyttävät moniulotteisessa esityksessä (esim. gitk tai qgit) 
tältä:

   A

   a
  / \
 b   c
  \ /
   m

Sen jälkeen B yhdistää A:n haaran omaansa. Tässä git ja bzr eroavat 
toisistaan. Gitissä B saa automaattisesti A:n kanssa identtisen haaran, 
jossa ristiriita on ratkaistu ja haarat yhdistyvät nätisti. Sekä A:lla 
että B:llä lineaarinen versiohistoria (git log) näyttää samalta:

 A ja B

  a
  |
  b
  |
  c
  |
  m

Commitit ovat molemmilla samassa järjestyksessä ja niiden tunnukset ovat 
identtiset.

(Sivuhuomautus: Gitissä commit-tunnukset ovat SHA1-koodeja, 
esim. "f63b1d8b62ea72504f85e003817e67012ff7df3b". Sama tunnus 
tarkoittaa täsmälleen samaa commitia kaikkialla maailmassa, koska 
SHA1-koodin laskemiseen käytetään paitsi kyseisen commitin kaikkea 
tietoa mutta myös sitä edeltävän commitin koodia. Commit-tunnukset siis 
tavallaan sisältävät koko repositoryn siihenastisen historian.)

Sen sijaan bzr:ssä A ja B kumpikin tekevät oman merge-commitinsa ja 
kirjoittavat oman commit-viestinsä. B:n, joka yhdisti haarat 
jälkimmäisenä, ei onneksi kuitenkaan tarvitse enää ratkaista 
ristiriitaa. Hän näkee omassa versiohistoriassaan myös A:n tekemän 
merge-commitin (m1). B:n tekemä merge-commit (m2) ei siis oikeastaan 
sisällä muuta tietoa kuin vain B:n kirjoittaman viestin, että "tulipa 
tehtyä merge". Commitit ovat kummallakin eri järjestyksessä. Erot voisi 
kuvata näin:

  A     B

  a     a
  |     |
  b     c
  |     |
  c'    b'
  |     |
  m1    m1'
        |
        m2

Bzr numeroi commitit 1:stä eteenpäin numerojärjestyksessä, mutta 
toisesta haarasta yhdistetyt (') commitit saavat alanumeroita: 1.1.1, 
1.1.2 jne. Näitä numeroita ei voi käyttää universaalisti, koska eri 
haaroissa ne tarkoittavat eri asioita. Vain jos on jokin keskuspalvelin 
tai sovittu päähaara, niin sitä kautta voi ehkä viitata sen projektin 
sisällä revisionumeroilla. Se ei tietenkään ole enää hajautettu malli. 
Bzr:ssä on onneksi revision-id:t, jotka ovat yksilöllisiä ja ilmeisesti 
universaaleja. Ne täytyy erikseen kaivaa esiin esimerkiksi 
komennolla "bzr log --show-ids". Revision-id:t ovat 
muotoa "tlikonen at iki.fi-20080216213631-1gu7cf6f2ucsjxhk".

Tällä perusteella minusta git toimii kauniimmin varsinkin hajautetussa 
mallissa ja järjestelmän "sisäisen kauneuden" vuoksi yhtä lailla 
kauniisti myös keskitetyssä mallissa. Yhtenä syynä on se, että käytössä 
ovat aina pelkästään universaalit commit-tunnukset, ei mitään 
paikallisia, haarakohtaisia revisioita. Toinen syy on, että jos 
vaikkapa 10 hengen ryhmä tekee kehitystyötä ja ristiin rastiin yhdistää 
muutokset, niin gitissä kaikilla on lopulta identtinen lähdekoodipuu ja 
versiohistoria. Bzr:ssäkin tietysti lähdekoodipuu on kaikilla lopuksi 
identtinen, mutta versiohistoria on kaikilla hieman erilainen. Ero 
johtuu siitä, että jokainen joutuu tekemään oman merge-commitinsa 
siinäkin tapauksessa, että haarojen yhdistäminen sujuu vain lisäämällä 
uusia commiteja entisen perään (ns. fast-forward-tapaus).

Ohjelmien kehittäjien viestejä lukemalla selvisi, että bzr pitää 
alkuperäistä haaraa - ilmeisesti sitä, josta otetaan kopio - jotenkin 
ensisijaisena myös teknisessä mielessä. En oikein ole vielä ymmärtänyt, 
että millä tavalla. Gitin haarat ovat aidosti yhtä arvokkaita olivatpa 
ne sitten samassa repositoryssa tai vaikka eri puolilla maailmaa. Gitin 
versiohistoria (git log) ei erottele mitään "pää-commiteja" 
ja "haara-commiteja" vaan kaikki commitit ovat saman arvoisia 
riippumatta niiden alkuperästä (myös esim. sähköpostilla lähetetyt).

Käyttöliittymän kannalta bzr on hyvin lähellä svn:ää, eli svn:n jälkeen 
perusasiat oppii hetkessä. Gitin perusasioiden oppimiseen meni minulta 
pari päivää. Erityisesti haarat gitissä käsitellään ihan eri tavalla - 
tavalla, johon itse olen erityisen ihastunut. :)

Joka tapauksessa molemmat ovat erittäin päteviä järjestelmiä. 
Mercurialiin en ole tutustunut vielä lainkaan; joskus pitänee sekin 
katsastaa. Kiitokset Ville-Pekalle vinkistä.



More information about the voikko mailing list