NAPOMENA: Toliko od mene za sad. Ovaj guide nije dovršen, updateati ću ga kroz sljedećih par dana dok ću imati vremena. Još će neke teme biti obrađene te trenutne bolje objašnjene i uređene. Ako imate kakvih komentara/prijedloga dodajte komentar i potrudit ću se da uvažim iste. Hvala na strpljenju.
Ako ste aktivni u svijetu programiranja bilo koje vrste sigurno ste čuli za Git. To mistično stvorenje i sva njegova komplicirana terminologija koja uključuje, kojekakve grane, vilice, merge-eve, commit-eve, pull request-ove i sl. Gotovo svaki open source projekt nalazi se na GitHub-u ili BitBucket-u, razne priče o kompanijama koje pregledavaju vašu GitHub aktivnost kod traženja zaposlenja, no ipak ta njegova naizgled komplicirana vanjština me godinama spriječavala da se potrudim i pročitam što to mistično stvorenje i radi.
No jednog kišovitog dana, kad je ostatak normalnog društva bio u krevetu, inspiriran dosadom odlučio sam uloviti i tog mačka za rep.
Ovo je guide za ljude poput mene, koji žele naučiti što je i kako se koristi Git, skupa s primjerima i kvalitetnim (a i pokojom nekvalitetnom) slikama.
Što je Git?
Koliko puta vam se desilo da ste izvrnuli "sto i jednu" klasu i promjenili cijelu bazu aplikacije kako bi implementirali neku značajku i onda shatili da to neće raditi zbog XXX razloga, naravno bez da ste imali backup te potrošili još više vremena vračajući sve u prvobitno stanje? Jeli vam se ikad desilo da jedini disk na kojem je projekt bio pohranjen odjednom ode u vječna lovišta ili se formatira zajedno s svim tim satima rada i i litrama znoja? Jeste li ikad htjeli kolaborirati na jednom projektu, ali niste znali praktično riješenje kako uređivati istu datoteku istovremeno? Pogotovo ako osobe s kojima bi trebali surađivati žive na drugom kraju Hrvatske ili čak planeta.
Vašim problemima došao je kraj, pogledali se u daljinu i uzviknuli: "It's a bird, it's a plane, IT'S.......gitman??...".
Tada u vaš vidni krug doletjelo je ovo:
Git je sustav koji pohranjuje svaku vašu promjenu, no za razliku od ručnog backupiranja on to radi tako da sprema samo razlike u datotekama, ne i cijeli projekt (više o tome u nastavku) što ne znači samo veliku uštedu prostora nego mu i donosi mnoge nove mogučnosti. On također omogućuje da više ljudi sudjeluje u jednom projektu istovremeno. Moguće je čak i otvoriti taj projekt javnosti i dozvoliti tisučama ljudi da dodaju značajke u vaš projekt, ili naprave od vašeg projekta neki drugi u drugačijem smjeru. Isto tako Git decentralizira backup, backup neće više biti pohranjen samo na jednom disku, nego će biti kod svakog tko je sudjelovao u projektu pa čak i na nekom udaljenom serveru kao centralna baza.
Instalacija
Prvo i osnovno, kako bi počeli koristiti Git, morate ga i skinuti. To možete učiniti na ovoj adresi, Git open source program dostupan za sve poznate platforme (Win, Linux, OS X) no ja ću se u ovom vodiču koristiti Gitom za Windows, no sve komande i principi ostaju isti na svim platformama.
Nakon što ste Git skinuli, instalirajte ga, instalacija je dosta jednostavna te mislim da tu nebi trebali biti problema.
Početak korištenja
Sad vas molim da rastegnete prstiće, popucate zglobovima i pripremite se za tipkanje u " good ol' " command promptu (Terminal na Linuxu i OS X). Ukoliko koristite Windows 7+ možete koristiti i PowerShell. Moram napomenuti da trebate neko osnovno znanje komandi za "šetanje" po file systemu kako bi koristili Git.
Navigirajte se do direktorija u kojem želite spremiti mapu s vašim novim projektom te izradite mapu s simboličnim imenom, ja ću za svrhu ovog vodiča kreirati folder imena "GitTest".
Uđite u novo-kreiranu mapu te utipkajte komandu:
git init
Ova komanda kreira sve datoteke koje Git koristi kako bi funkcionirao, ona će kreirati par skrivenih datoteka u tom folderu te se s njima nemojte zamarati.
Sada ste uspješno kreirali vaš git "repository". Tu mapu možete koristiti kao i svaku drugu normalnu mapu. Sve povezano s projektom koji radite stavljajte u tu mapu.
Git add i commit
Commit je neka točka u povijesti projekta koja je promjenila neku značajku u odnosu na zadnju točku.
Kako bi ilustrirao bit add-a i commit-a kreirao sam tekstualnu datoteku "tekst.txt" u našoj mapi. Ona je prvobitno prazna:
No git trenutno tu datoteku ne prati, kako bi Git dodao promjene u toj datoteci u sljedeći commit koristimo ovu komandugit add tekst.txt
No naše promjene sada nisu spremljene, da bi napravili tu točku, u koju ćemo se kasnije moći vraćati moramo tu promjenu i commit-ati. To čemo učiniti komandom:
git commit -m "Dodana datoteka tekst.txt."
Primjetite da komanda commit prima parametar -m. Taj parametar dodaje tom commit-u neki komentar, tako da kasnije kad ćemo trebati naći spornu promjenu možemo lako prolistati kroz sve commiteve. U njima se opisuje radnja koju ste učinili, na primjer: "Popravlja MySql injection exploit u polju naziv kod dodavanja novog artikla.". Pokušajte biti čim precizniji i točniji, ali isto tako koristiti čim manje riječi.
Git nas sada obaviješta o svim promjenama koje su učinjene u tom commitu. Pokušajte sada izvršiti istu komandu ponovo.Git će izbaciti "nothing to commit, working directory clean", on nas time obavještava da nije našao nikakve promjene u našem direktoriju. Što znači jednu od dvije stvari, da smo zaboravili dodati u sljedeći commit (git add) datoteku koju smo promjenili ili jednostavno nismo napravili nikakve nove promjene.
Sad ćemo promjeniti našu datoteku i ponoviti ovo. Ja sam u svom primjeru dodao 3 vica u datoteku i to spremio.
Sada opet dodamo datoteku u sljedeći commit (git add) te taj commit spremiti (git commit) sljedećim komandama:
git add tekst.txt
git commit -m "Dodana 3 vica."
Git nas opet obavještava o promjenama (promjenjena 1 datotka, dodano 10 redova).No ja sam nakon sata premišljanja odlučio da mi se vic o kupusu ne sviđa pa ga želim izbaciti. Izbrišem isti u datoteci, spremim je te ponovim postupak committ-a:
git add tekst.txt
git commit -m "Uklonjen vic s kupusom."
Git nam sada javlja poruku da je promjenjena 1 datoteka te izbrisano 4 reda (3 reda s vicem i jedan prazan). Ovo je bilo bitno da pokažem kako Git razmišlja o podatcima:
Naime Git nije ponovo spremao cijelu datoteku jer se dogodila promjena u njoj. On je samo zapamtio da su ta 3 reda oduzeta, što zauzima puno manje prostora nego da se išla spremati cijela datoteka nanovo. To bilježenje promjena omogućuje sve ono što sam gore naveo bez ogromne potrošnje podatkovnih kapaciteta.
Djeljenje Git repository-a na GitHub-u
Kako bi podjelili naš Git repository s cijelim svijetom ili s grupom ljudi s kojom radimo možemo koristiti mnoge online Git hosting usluge, od kojih su mnoge besplatne. Najpopularnije su BitBucket i GitHub. Ja ću kreirati novi javni repository na GitHub-u. Proces je vrlo jednostavan, registrirate se te pritiskom na gumb napravite novi repository te ga imenujete, odredite dali je javan ili privatan, te dodate neki opis.
Kada ste ga kreirali dobit ćete link, pomoću tog linka možete uploadati vaš lokalni repository u vaš online repository na GitHub-u pomoću ovih komandi:
git remote add origin https://github.com/Username/Ime-repoa.git
Sada ste u svoj git repository dodali centralni server. Kako bi uploadali sve svoje promjene na njega koristite komandu:
git push origin master
Svaki put kad želite promjene na svom lokalnom serveru uploadati na centralni koristite komandu iznad.
Sad su naše promjene vidljive svima.
Ovdje naprimjer možete provjeriti svaku promjenu koja je ikad napravljena na datoteci tekst.txt.
U našoj datoteci smo dodali 3 vica s 10 linija, i kasnije izbrisali jedan s 4. Što bi značilo da povijest naše datoteke izgleda ovako:
Kloniranje repository-a - sudjelovanje u tuđem projektu
Kako biste klonirali repository prvo trebate pronaći URL tog repository-a.
URL mog repository-a je https://github.com/TheWildHorse/GItTest-BugGuide.git
Kako bi kopirali sve podatke s tog repository-a na naše računalo koristimo sljedeću komandu:
git clone https://github.com/TheWildHorse/GItTest-BugGuide.git
Git će kreirati folder s tim projektom na našem računalu i skinuti sve podatke s online repository-a. Kako bi sudjelovali u projektu koristimo isti princip kao i iznad. Dodamo neku značajku u program, popravimo neki bug ili slično te metodom opisanom u sekciji "Git add i commit" dodamo tu točku promjene. Kako bi podjelili naše promjene s ostalim ljudima i vlasnikom projekta opet koristimo komandu kako bismo uploadali naše promjene na internet:
git push origin master
Grananje i spajanje grana
Svaki Git repository dolazi s glavnom granom, ona se naziva master. No Git dopušta dodavanje više grana odnosno branch-eva. Ako bi vi htjeli na svojem projektu otvoriti eksperimentalnu granu u kojoj bi htjeli pokušati implementirati neku funkciju za koju niste sigurni dali će raditi ili vam treba mnogo vremena za testiranje i ispravake prije nego ste spremni je izdati u javnost to baš i nebi bilo zgodno raditi u glavnoj grani jer bi time zaustavili njezin razvoj, i donjeli probleme kod korisnika koji koriste vašu aplikaciju.
Kako bi kreirali novu granu koristimo skup komandi:
git branch ime_nove_grane //Kreiramo novu granu na našem računalu
git push origin ime_nove grane //Uploadamo novu granu na naš Git host (GitHub, GitBucket..)
git checkout ime_nove_grane //Prebacujemo se na novu granu
Sad svaku promjenu koju učinimo više ne činimo na master grani nego na novoj grani. Opet koristimo isti sistem dodavanja i commit-anja no da bi poslali novu granu da naš Git host sada više ne koristimo:
git push origin master
Nego zamjenimo master s imenom naše grane koju uređujemo:
git push origin nova_grana
Kada smo zadovoljni s našim radom u grani i sve je detaljno iztestirano možemo je pripojiti našoj glavnoj (master grani). Bitno je napomenuti da kad ovo činimo sav napredak koji se dešavao u glavnoj grani dok smo mi radili u našoj odvojenoj grani NEĆE biti izgubljen iako neke značajke nisu pristupne u našoj grani. Git će svojim algoritmom pripojiti sve promjene u obje grane iako su se paralelno odvijale. Koristimo sljedeću komande:
git checkout master //Vračamo se u našu glavnu granu, ili u neku drugu granu kojoj želimo pripojiti našu novu granu
git merge nova_grana //Spaja trenutnu granu s nova_grana
Sada su sve promjene u master grani i nova_grana pripojene.