{"id":63,"date":"2014-05-11T17:44:16","date_gmt":"2014-05-11T15:44:16","guid":{"rendered":""},"modified":"2018-09-17T21:54:16","modified_gmt":"2018-09-17T19:54:16","slug":"verzionovanie-s-gitom-zaklady","status":"publish","type":"post","link":"https:\/\/spireng.sk\/en\/verzionovanie-s-gitom-zaklady\/","title":{"rendered":"Verzionovanie s Gitom \u2013 z\u00e1klady"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"imgp_img\" style=\"float: left; margin: 2px 5px;\" src=\"\/sites\/default\/files\/imagepicker\/1\/dsfd45df4.jpg\" alt=\"Obr\u00e1zok\" width=\"200\" height=\"215\" \/>Osobne pova\u017eujem pou\u017e\u00edvanie verzionovacieho syst\u00e9mu vo v\u00fdvoji za pomerne z\u00e1kladn\u00fa vec (teda, ak ste s\u00e1m, tak je na diskusiu, ak ste v t\u00edme, pre m\u0148a je to bez diskusie :)). \u010cas potrebn\u00fd na in\u0161talovanie, nastavenie a za\u0161kolenie \u013eud\u00ed na jeho pou\u017e\u00edvanie je v porovnan\u00ed s pr\u00ednosom, ktor\u00fd tak\u00fdto syst\u00e9m prin\u00e1\u0161a, zanedbate\u013en\u00fd. Hne\u010f ako prv\u00e9 v\u00fdhody ma napadaj\u00fa: jedno miesto s aktu\u00e1lnymi zdrojov\u00fdmi k\u00f3dmi, jednoduch\u00fd mechanizmus na zdie\u013eanie zdrojov\u00fdch k\u00f3dov medzi v\u00fdvoj\u00e1rmi, a samozrejme, stroj \u010dasu, ktor\u00fd v\u00e1s vr\u00e1ti \u013eubovo\u013ene do minulosti. A to som ur\u010dite nespomenul v\u0161etky v\u00fdhody. Na verzionovac\u00edch syst\u00e9moch je tie\u017e dobr\u00e9, \u017ee m\u00e1te na v\u00fdber. Je ich naozaj ve\u013ea r\u00f4znych druhov a s r\u00f4znymi vlastnos\u0165ami. Aby bolo bremeno vo\u013eby o \u010dosi \u013eah\u0161ie, pozrieme sa dnes skrz recenziu knihy na jeden z nich \u2013 Git.<!--more--><!--break--><\/p>\n<p>Git je optimistick\u00fd, distribuovan\u00fd verzionovac\u00ed syst\u00e9m. \u010co to presne znamen\u00e1? No je to roden\u00fd optimista, ktor\u00fd dovol\u00ed v rovnakom \u010dase meni\u0165 ten ist\u00fd s\u00fabor dvom \u013eu\u010fom a n\u00e1sledne (celkom optimisticky) sa pok\u00fasi tieto dve rozli\u010dn\u00e9 verzie spoji\u0165 do jednej. A aj sa mu to aj dar\u00ed. V pr\u00edpade, \u017ee si nevie so zmenami poradi\u0165, tak to pou\u017e\u00edvate\u013eovi ozn\u00e1mi, probl\u00e9mov\u00e9 \u010dasti v s\u00fabore mu ozna\u010d\u00ed a nech\u00e1 ho zmeny spoji\u0165 ru\u010dne. Naproti tomu pesimistick\u00e9 verzionovacie syst\u00e9my dovolia meni\u0165 ten ist\u00fd s\u00fabor len jedn\u00e9mu pou\u017e\u00edvate\u013eovi naraz, a teda nemusia v\u00f4bec rie\u0161i\u0165 sp\u00e1janie zmien, lebo neexistuje nie\u010do ako dve konkuren\u010dn\u00e9 verzie toho ist\u00e9ho s\u00faboru.<\/p>\n<p>\u010co znamen\u00e1, \u017ee je distribuovan\u00fd? Po\u010fme si to objasni\u0165 aj s oh\u013eadom na ostatn\u00e9 typy syst\u00e9mov. Z tohto poh\u013eadu rozpozn\u00e1vame tri tak\u00e9ho typy:<\/p>\n<ol>\n<li>lok\u00e1lny \u2013 verzionovac\u00ed syst\u00e9m je pr\u00edtomn\u00fd len na stroji v\u00fdvoj\u00e1ra. Umo\u017e\u0148uje mu pozera\u0165 si hist\u00f3riu zmien, ale nevie fungova\u0165 sie\u0165ovo, a teda neumo\u017e\u0148uje zdie\u013eanie zdrojov\u00fdch k\u00f3dov.<\/li>\n<li>centralizovan\u00fd \u2013 existuje jeden server, na ktorom s\u00fa ulo\u017een\u00e9 verzionovan\u00e9 s\u00fabory aj s celou hist\u00f3riou. V\u00fdvojari maj\u00fa na svojich lok\u00e1lnych po\u010d\u00edta\u010doch nie\u010do ako k\u00f3piu jednej verzie s\u00faborov, s ktorou pracuj\u00fa. Svoje zmeny posielaj\u00fa na cenr\u00e1lny server a odtia\u013e tie\u017e z\u00edskavaj\u00fa zmeny ostatn\u00fdch. Podstatn\u00e9 je, \u017ee u seba nemaj\u00fa k\u00f3piu cel\u00e9ho repozit\u00e1ra, a teda ak chc\u00fa robi\u0165 nejak\u00fa oper\u00e1ciu nad cel\u00fdm repozit\u00e1rom (napr\u00edklad prezeranie hist\u00f3rie) potrebuj\u00fa na to spojenie so serverom.<\/li>\n<li>distribuovan\u00fd \u2013 je to vlastne kombin\u00e1cia dvoch predch\u00e1dzaj\u00facich. Hlavn\u00e1 my\u0161lienka je, \u017ee ka\u017ed\u00fd z v\u00fdvoj\u00e1rov m\u00e1 u seba k\u00f3piu cel\u00e9ho repozit\u00e1ra, a teda aj oper\u00e1cie s\u00favisiace s cel\u00fdm repozit\u00e1rom vie robi\u0165 lok\u00e1lne na svojom po\u010d\u00edta\u010di.<\/li>\n<\/ol>\n<p>Tak to by bolo vysvetlenie optimizmu a distribuovanosti gitu. Tak nejako aj za\u010d\u00edna kniha <a href=\"http:\/\/www.bookdepository.com\/Version-Control-with-Git-Jon-Loeliger\/9781449316389\">Git: Version Control for Everyone<\/a> od <em>Ravishankar Somasundaram<\/em>. Samozrejme je tam toho viac a d\u00e1vkovan\u00e9 celkom v primeranom tempe. Tak aby ste nezaspali, ale ani nestratili ni\u0165. \u010co \u010falej?<\/p>\n<p>No, na pr\u00e1cu s Gitom mus\u00edte pozna\u0165 jeho oper\u00e1cie a mus\u00edte aspo\u0148 tak trochu rozumie\u0165, \u010do sa za nimi skr\u00fdva. V\u0161etko za\u010d\u00edna pr\u00edkazom <em>git init<\/em><span style=\"font-style: normal;\">. Ten v\u00e1m na disku z \u013eubovo\u013en\u00e9ho adres\u00e1ra vytvor\u00ed git <\/span><span style=\"font-style: normal;\"><span style=\"background: transparent;\">repozit\u00e1r.<\/span><\/span><span style=\"font-style: normal;\"> Odteraz viete s\u00fabory v tom adres\u00e1ri verzionova\u0165 alebo spravova\u0165. Hlavn\u00fdm pr\u00edznakom toho, \u017ee adres\u00e1r je vlastne repozit\u00e1r, je skryt\u00fd <\/span><em>.git<\/em><span style=\"font-style: normal;\"> podadres\u00e1r. V \u0148om si Git uchov\u00e1va v\u0161etky potrebn\u00e9 repozit\u00e1rov\u00e9 inform\u00e1cie. Autor vysvet\u013euje aj \u0161trukt\u00faru a obsah tohto adres\u00e1ra a dokonca zach\u00e1dza do objek<\/span><span style=\"font-style: normal;\">t<\/span><span style=\"font-style: normal;\">ov\u00e9ho modulu, ktor\u00fd Git na pozad\u00ed pou\u017e\u00edva, ale rozobera\u0165 toto by bolo mimo rozsah tohto \u010dl\u00e1nku. Namiesto toho je podstatnej\u0161ie si pozrie\u0165 \u010fal\u0161ie pr\u00edkazy Gitu:<\/span><\/p>\n<ul>\n<li><em>git add<\/em><span style=\"font-style: normal;\"> \u2013 pridanie rozdielov v sledovanom repozit\u00e1ry do tzv. staged <\/span><span style=\"font-style: normal;\"><span style=\"background: transparent;\">cha<\/span><\/span><span style=\"font-style: normal;\"><span style=\"background: transparent;\">n<\/span><\/span><span style=\"font-style: normal;\"><span style=\"background: transparent;\">ges<\/span><\/span><span style=\"font-style: normal;\"> \u2013 teda mno\u017einy zmien, ktor\u00e9 bud\u00fa commitnut\u00e9 pri najbli\u017e\u0161om commite<\/span><\/li>\n<li><em>git commit<\/em><span style=\"font-style: normal;\"> \u2013 commitnutie zmien \u2013 ich ulo\u017eenie do repozit\u00e1ra, vznik<\/span><span style=\"font-style: normal;\">\u00e1<\/span><span style=\"font-style: normal;\"> tak nov\u00e1 rev\u00edzia v hist\u00f3rii<\/span><\/li>\n<\/ul>\n<ul>\n<li><em>git clone<\/em><span style=\"font-style: normal;\"> \u2013 vytvor\u00ed k\u00f3piu vzdialen\u00e9ho repozit\u00e1ra. To je presne ten pr\u00edkaz, ktor\u00fd potrebujete, ak chcete za\u010da\u0165 pracova\u0165 s nejak\u00fdm existuj\u00facim vzdialen\u00fdm repozit\u00e1rom (napr\u00edklad nie\u010do z <a href=\"https:\/\/github.com\/\">Githubu<\/a><\/span><span style=\"font-style: normal;\">)<\/span><span style=\"font-style: normal;\">.<\/span><\/li>\n<li><em>git fetch<\/em><span style=\"font-style: normal;\"> \u2013 stiahnutie zmien zo vzdialen\u00e9ho repozit\u00e1ra do lok\u00e1lneho repozit\u00e1ra. Zmeny s\u00fa ulo\u017een<\/span><span style=\"font-style: normal;\">\u00e9<\/span><span style=\"font-style: normal;\"> pod \u0161peci\u00e1lnym branchom (<\/span><span style=\"font-style: normal;\">\u010do je <\/span><span style=\"font-style: normal;\">branch? &#8211; pozri ni\u017e\u0161ie) a nie s\u00fa priamo zmergovan\u00e9 s hlavnou vetvou<\/span><\/li>\n<li><em>git merge<\/em><span style=\"font-style: normal;\"> \u2013 merge jedn\u00e9ho branchu do druh\u00e9ho<\/span><\/li>\n<li><em>git push<\/em><span style=\"font-style: normal;\"> \u2013 poslanie zmien na vzdialen\u00fd server<\/span><\/li>\n<li><em>git remote<\/em><span style=\"font-style: normal;\"> \u2013 registrovanie vzdialen\u00e9ho <\/span><span style=\"font-style: normal;\"><span style=\"background: transparent;\">repozit<\/span><\/span><span style=\"font-style: normal;\"><span style=\"background: transparent;\">\u00e1<\/span><\/span><span style=\"font-style: normal;\"><span style=\"background: transparent;\">r<\/span><\/span><span style=\"font-style: normal;\"><span style=\"background: transparent;\">a<\/span><\/span><span style=\"font-style: normal;\">. Jednoduch\u0161ie sa d\u00e1 potom pou\u017e\u00edva\u0165 pri git pr\u00edkazoch<\/span><\/li>\n<li><em>git pull<\/em><span style=\"font-style: normal;\"> \u2013 to je vlastne git fetch + git merge \u2013 teda z\u00edskanie zmien zo vzdialen\u00e9ho repozit\u00e1ra a ich zamergovanie do hlavnej vetvy<\/span><\/li>\n<li><em>git log<\/em><span style=\"font-style: normal;\"> \u2013 v\u00fdpis hist\u00f3rie repozit\u00e1ra. Ako a ak\u00e1 hist\u00f3ria sa m\u00e1 vyp\u00edsa\u0165 z\u00e1vis<\/span><span style=\"font-style: normal;\">\u00ed<\/span><span style=\"font-style: normal;\"> na prep\u00edna\u010doch pr\u00edkazu.<\/span><\/li>\n<li><em>git clean<\/em><span style=\"font-style: normal;\"> \u2013 odstr\u00e1nenie s\u00faborov, ktor\u00e9 nie s\u00fa v repozit\u00e1ry ani v staged changes zo sledovan\u00e9ho adres\u00e1ra<\/span><\/li>\n<li><em>git tag<\/em><span style=\"font-style: normal;\"> \u2013 vytvorenie tagu \u2013 to je nie\u010do ako read-only branch<\/span><\/li>\n<li><em>git checkout<\/em><span style=\"font-style: normal;\"> \u2013 pomocou tohto pr\u00edkazu viem v repozit\u00e1ry z\u00edska\u0165 nejak\u00fa konkr\u00e9tnu rev\u00edziu z hist\u00f3rie repozit\u00e1ra (alebo nejak\u00fd branch, \u010do v pr\u00edpade gitu nie je a\u017e tak\u00fd ve\u013ek\u00fd rozdiel)<\/span><\/li>\n<li><em>git <span style=\"background: transparent;\">branche<\/span><\/em><span style=\"font-style: normal;\"> \u2013 vytvorenie branchu<\/span><\/li>\n<\/ul>\n<p>Ak po pre\u010d\u00edtan\u00ed tohto zoznamu v tom m\u00e1te zm\u00e4tok, je to preto, lebo bez nejak\u00fdch z\u00e1kladov vo verzionovac\u00edch syst\u00e9mov je toto pr\u00edli\u0161 stru\u010dn\u00fd zoznam na str\u00e1venie (alebo je tie\u017e mo\u017en\u00e9, \u017ee ja neviem dobre vysvet\u013eova\u0165, ale t\u00fato mo\u017enos\u0165 si neprip\u00fa\u0161\u0165am :)). V takom pr\u00edpade v\u00e1m odpor\u00fa\u010dam siahnu\u0165 naozaj po knihe, kde je ka\u017ed\u00e9mu pr\u00edkazu venovan\u00fdch nieko\u013eko str\u00e1n.<\/p>\n<p>Branch! \u00c1no. S\u013e\u00fabil som to vysvetli\u0165. Branch je vlastne paral\u00e9lny vesm\u00edr, v ktorom tie ist\u00e9 s\u00fabory vyzeraj\u00fa trochu inak. Branchovanie je funkcionalita, ktor\u00e1 v\u00e1m umo\u017e\u0148uje nemeni\u0165 s\u00fabory len line\u00e1rne, t.z. za ka\u017edou verziou nasleduje pr\u00e1ve jedna \u010fal\u0161ia verzia, ale postupnos\u0165 verzi\u00ed rozvetvova\u0165, tak\u017ee v jednom momente m\u00f4\u017eete ma\u0165 viac verzi\u00ed t\u00fdch ist\u00fdch s\u00faborov naraz a prep\u00edna\u0165 sa medzi nimi. Git miluje branche. Umo\u017e\u0148uje ich \u013eahko vytv\u00e1ra\u0165, prep\u00edna\u0165 sa medzi nimi (vyjasnime si \u2013 prep\u00ednanie znamen\u00e1, \u017ee sa v\u00e1m vo va\u0161om repozit\u00e1rovom adres\u00e1ri objavia v danom momente s\u00fabory z verzie z dan\u00e9ho branchu) a mergova\u0165. Mergovanie je proces, kedy zmeny z viacer\u00fdch branchov spoj\u00edte do jedn\u00e9ho. K branchom u\u017e len to\u013eko, \u017ee jeden z nich sa naz\u00fdva Master, je to ten jeden hlavn\u00fd, ktor\u00fd by mal reprezentova\u0165 hlavn\u00fa hist\u00f3riu v repozit\u00e1ry.<\/p>\n<p>Predch\u00e1dzaj\u00face odstavce predstavuj\u00fa len \u013eahk\u00fd prelet mo\u017enos\u0165ami gitu. Je toho omnoho viac, \u010do sa s git-om d\u00e1 robi\u0165 a \u010do o \u0148om treba poveda\u0165. \u010eal\u0161iu d\u00e1vku inform\u00e1ci\u00ed m\u00f4\u017eete z\u00edska\u0165 v pr\u00e1ve spom\u00ednanej knihe, ktor\u00e1 m\u00e1 pr\u00edjemn\u00fdch 180 str\u00e1n. Autor sa sna\u017e\u00ed git vysvet\u013eova\u0165 jazykom \u0161irokej verejnosti (teda, nie len program\u00e1torom, ale aj in\u00fdm \u013eudom z IT) a aj pr\u00edklady obsahuj\u00fa r\u00f4zne s\u00fabory \u2013 nie len zdrojov\u00e9 k\u00f3dy. Ni\u010d to ale neuber\u00e1 na hodnote inform\u00e1ci\u00ed v knihe obsiahnut\u00fdch. Okrem t\u00e9m, ktor\u00e9 som spomenul, v knihe tie\u017e n\u00e1jdete inform\u00e1cie o in\u0161talovan\u00ed gitu, o ru\u010dnom mergovan\u00ed s\u00faborov (ak git nedok\u00e1\u017ee spoji\u0165 zmeny z branchov v jednom s\u00fabore \u2013 nech\u00e1 to na v\u00e1s), ako si u\u013eah\u010dova\u0165 pr\u00e1cu s gitom, a tie\u017e tzv. low-level pr\u00edkazy, ktor\u00e9 stoja za pr\u00edkazmi z vy\u0161\u0161ie spom\u00ednan\u00e9ho zoznamu. Git: Version Control for Everyone je vhodn\u00e1 kniha pre Git za\u010diato\u010dn\u00edkov. Z m\u00f4jho poh\u013eadu ale obsahuje len z\u00e1kladn\u00e9 inform\u00e1cie, a teda pre ostrie\u013ean\u00fdch Git pou\u017e\u00edvate\u013eov u\u017e nemus\u00ed prin\u00e1\u0161a\u0165 a\u017e tak\u00fd ve\u013ek\u00fd osoh. Ka\u017edop\u00e1dne roz\u0161irovanie Gitu (a jemu podobn\u00fdch, distribuovan\u00fdch, verzionovac\u00edch syst\u00e9mov) v posledn\u00fdch rokoch je neprehliadnute\u013en\u00e9, tak\u017ee zvl\u00e1dnu\u0165 aspo\u0148 z\u00e1klady sa m\u00f4\u017ee v\u017edy hodi\u0165.<\/p>","protected":false},"excerpt":{"rendered":"<p>Osobne pova\u017eujem pou\u017e\u00edvanie verzionovacieho syst\u00e9mu vo v\u00fdvoji za pomerne z\u00e1kladn\u00fa vec (teda, ak ste s\u00e1m, tak je na diskusiu, ak ste v t\u00edme, pre m\u0148a je to bez diskusie :)). \u010cas potrebn\u00fd na in\u0161talovanie, nastavenie a za\u0161kolenie \u013eud\u00ed na jeho pou\u017e\u00edvanie je v porovnan\u00ed s pr\u00ednosom, ktor\u00fd tak\u00fdto syst\u00e9m prin\u00e1\u0161a, zanedbate\u013en\u00fd. Hne\u010f ako prv\u00e9 v\u00fdhody [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":["post-63","post","type-post","status-publish","format-standard","hentry","category-vyvoj-softveru"],"_links":{"self":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/63","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/comments?post=63"}],"version-history":[{"count":1,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/63\/revisions"}],"predecessor-version":[{"id":172,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/63\/revisions\/172"}],"wp:attachment":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/media?parent=63"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/categories?post=63"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/tags?post=63"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}