ObrázokOsobne považujem používanie verzionovacieho systému vo vývoji za pomerne základnú vec (teda, ak ste sám, tak je na diskusiu, ak ste v tíme, pre mňa je to bez diskusie :)). Čas potrebný na inštalovanie, nastavenie a zaškolenie ľudí na jeho používanie je v porovnaní s prínosom, ktorý takýto systém prináša, zanedbateľný. Hneď ako prvé výhody ma napadajú: jedno miesto s aktuálnymi zdrojovými kódmi, jednoduchý mechanizmus na zdieľanie zdrojových kódov medzi vývojármi, a samozrejme, stroj času, ktorý vás vráti ľubovoľne do minulosti. A to som určite nespomenul všetky výhody. Na verzionovacích systémoch je tiež dobré, že máte na výber. Je ich naozaj veľa rôznych druhov a s rôznymi vlastnosťami. Aby bolo bremeno voľby o čosi ľahšie, pozrieme sa dnes skrz recenziu knihy na jeden z nich – Git.

Git je optimistický, distribuovaný verzionovací systém. Čo to presne znamená? No je to rodený optimista, ktorý dovolí v rovnakom čase meniť ten istý súbor dvom ľuďom a následne (celkom optimisticky) sa pokúsi tieto dve rozličné verzie spojiť do jednej. A aj sa mu to aj darí. V prípade, že si nevie so zmenami poradiť, tak to používateľovi oznámi, problémové časti v súbore mu označí a nechá ho zmeny spojiť ručne. Naproti tomu pesimistické verzionovacie systémy dovolia meniť ten istý súbor len jednému používateľovi naraz, a teda nemusia vôbec riešiť spájanie zmien, lebo neexistuje niečo ako dve konkurenčné verzie toho istého súboru.

Čo znamená, že je distribuovaný? Poďme si to objasniť aj s ohľadom na ostatné typy systémov. Z tohto pohľadu rozpoznávame tri takého typy:

  1. lokálny – verzionovací systém je prítomný len na stroji vývojára. Umožňuje mu pozerať si históriu zmien, ale nevie fungovať sieťovo, a teda neumožňuje zdieľanie zdrojových kódov.
  2. centralizovaný – existuje jeden server, na ktorom sú uložené verzionované súbory aj s celou históriou. Vývojari majú na svojich lokálnych počítačoch niečo ako kópiu jednej verzie súborov, s ktorou pracujú. Svoje zmeny posielajú na cenrálny server a odtiaľ tiež získavajú zmeny ostatných. Podstatné je, že u seba nemajú kópiu celého repozitára, a teda ak chcú robiť nejakú operáciu nad celým repozitárom (napríklad prezeranie histórie) potrebujú na to spojenie so serverom.
  3. distribuovaný – je to vlastne kombinácia dvoch predchádzajúcich. Hlavná myšlienka je, že každý z vývojárov má u seba kópiu celého repozitára, a teda aj operácie súvisiace s celým repozitárom vie robiť lokálne na svojom počítači.

Tak to by bolo vysvetlenie optimizmu a distribuovanosti gitu. Tak nejako aj začína kniha Git: Version Control for Everyone od Ravishankar Somasundaram. Samozrejme je tam toho viac a dávkované celkom v primeranom tempe. Tak aby ste nezaspali, ale ani nestratili niť. Čo ďalej?

No, na prácu s Gitom musíte poznať jeho operácie a musíte aspoň tak trochu rozumieť, čo sa za nimi skrýva. Všetko začína príkazom git init. Ten vám na disku z ľubovoľného adresára vytvorí git repozitár. Odteraz viete súbory v tom adresári verzionovať alebo spravovať. Hlavným príznakom toho, že adresár je vlastne repozitár, je skrytý .git podadresár. V ňom si Git uchováva všetky potrebné repozitárové informácie. Autor vysvetľuje aj štruktúru a obsah tohto adresára a dokonca zachádza do objektového modulu, ktorý Git na pozadí používa, ale rozoberať toto by bolo mimo rozsah tohto článku. Namiesto toho je podstatnejšie si pozrieť ďalšie príkazy Gitu:

  • git add – pridanie rozdielov v sledovanom repozitáry do tzv. staged changes – teda množiny zmien, ktoré budú commitnuté pri najbližšom commite
  • git commit – commitnutie zmien – ich uloženie do repozitára, vzniká tak nová revízia v histórii
  • git clone – vytvorí kópiu vzdialeného repozitára. To je presne ten príkaz, ktorý potrebujete, ak chcete začať pracovať s nejakým existujúcim vzdialeným repozitárom (napríklad niečo z Githubu).
  • git fetch – stiahnutie zmien zo vzdialeného repozitára do lokálneho repozitára. Zmeny sú uložené pod špeciálnym branchom (čo je branch? – pozri nižšie) a nie sú priamo zmergované s hlavnou vetvou
  • git merge – merge jedného branchu do druhého
  • git push – poslanie zmien na vzdialený server
  • git remote – registrovanie vzdialeného repozitára. Jednoduchšie sa dá potom používať pri git príkazoch
  • git pull – to je vlastne git fetch + git merge – teda získanie zmien zo vzdialeného repozitára a ich zamergovanie do hlavnej vetvy
  • git log – výpis histórie repozitára. Ako a aká história sa má vypísať závisí na prepínačoch príkazu.
  • git clean – odstránenie súborov, ktoré nie sú v repozitáry ani v staged changes zo sledovaného adresára
  • git tag – vytvorenie tagu – to je niečo ako read-only branch
  • git checkout – pomocou tohto príkazu viem v repozitáry získať nejakú konkrétnu revíziu z histórie repozitára (alebo nejaký branch, čo v prípade gitu nie je až taký veľký rozdiel)
  • git branche – vytvorenie branchu

Ak po prečítaní tohto zoznamu v tom máte zmätok, je to preto, lebo bez nejakých základov vo verzionovacích systémov je toto príliš stručný zoznam na strávenie (alebo je tiež možné, že ja neviem dobre vysvetľovať, ale túto možnosť si nepripúšťam :)). V takom prípade vám odporúčam siahnuť naozaj po knihe, kde je každému príkazu venovaných niekoľko strán.

Branch! Áno. Sľúbil som to vysvetliť. Branch je vlastne paralélny vesmír, v ktorom tie isté súbory vyzerajú trochu inak. Branchovanie je funkcionalita, ktorá vám umožňuje nemeniť súbory len lineárne, t.z. za každou verziou nasleduje práve jedna ďalšia verzia, ale postupnosť verzií rozvetvovať, takže v jednom momente môžete mať viac verzií tých istých súborov naraz a prepínať sa medzi nimi. Git miluje branche. Umožňuje ich ľahko vytvárať, prepínať sa medzi nimi (vyjasnime si – prepínanie znamená, že sa vám vo vašom repozitárovom adresári objavia v danom momente súbory z verzie z daného branchu) a mergovať. Mergovanie je proces, kedy zmeny z viacerých branchov spojíte do jedného. K branchom už len toľko, že jeden z nich sa nazýva Master, je to ten jeden hlavný, ktorý by mal reprezentovať hlavnú históriu v repozitáry.

Predchádzajúce odstavce predstavujú len ľahký prelet možnosťami gitu. Je toho omnoho viac, čo sa s git-om dá robiť a čo o ňom treba povedať. Ďalšiu dávku informácií môžete získať v práve spomínanej knihe, ktorá má príjemných 180 strán. Autor sa snaží git vysvetľovať jazykom širokej verejnosti (teda, nie len programátorom, ale aj iným ľudom z IT) a aj príklady obsahujú rôzne súbory – nie len zdrojové kódy. Nič to ale neuberá na hodnote informácií v knihe obsiahnutých. Okrem tém, ktoré som spomenul, v knihe tiež nájdete informácie o inštalovaní gitu, o ručnom mergovaní súborov (ak git nedokáže spojiť zmeny z branchov v jednom súbore – nechá to na vás), ako si uľahčovať prácu s gitom, a tiež tzv. low-level príkazy, ktoré stoja za príkazmi z vyššie spomínaného zoznamu. Git: Version Control for Everyone je vhodná kniha pre Git začiatočníkov. Z môjho pohľadu ale obsahuje len základné informácie, a teda pre ostrieľaných Git používateľov už nemusí prinášať až taký veľký osoh. Každopádne rozširovanie Gitu (a jemu podobných, distribuovaných, verzionovacích systémov) v posledných rokoch je neprehliadnuteľné, takže zvládnuť aspoň základy sa môže vždy hodiť.