Kratek tečaj Gita

Git je program za sledenje različic datotek, ki ga je napisal Linus Torvalds. V zelo kratkem času je git postal standard na svojem področju, spletna stran Github pa največje skladišče odprtokodne programske opreme, ki uporablja Git. Nekateri so mnenja, da je git težak za uporabo. Jaz ne mislim tako, in sem s tem namenom napisal tale kratek uvod, ki vsebuje bistvo, s katerim lahko že danes začnete uporabljati to nepogrešljivo orodje.

Osnove

Vsi ukazi se začnejo z git Podrobna navodila za uporabo so na http://git-scm.com/doc , kratka navodila dobiš z ukazi

man git

git --help 

--help je na voljo tudi za vsak posamezen ukaz

Git status

Dobro se je navaditi začet delo z ukazom git status Pove ti, ali je delovni direktorij čist in ti izpiše vse datoteke, ki še niso v repozitoriju, ter spremenjene datoteke, ki še niso commitane. Zato je uporaben tudi preden delaš commit, saj ti pove katere datoteke si spremenil/dodal/zbrisal in jih ti s tem pomaga pri pisanju commit sporočila.

Kadar imaš več vej (branches), se je dobro pred delom tudi prepričati v kateri veji se nahajaš. Ukaz git branch ti izpiše seznam vej v lokalnem repozitoriju in z zvezdico označi trenutno aktivno vejo.

Kako narediš commit

Spremembe v repozitorij vpišeš z git commit , ta ukaz zahteva določene argumente. Preden ga poženeš pa je dobro narediti/preveriti nekaj stvari:

Najprej z git status preveriš katere datoteke so spremenjene in ali obstajajo nove datoteke, ki še niso v repozitoriju.

Nato z git add . dodaš vse še neobstoječe datoteke v repozitorij. Pika pomeni vse (kot pri regularnih izrazih). Če namesto pike vpišeš določeno datoteko, bo dodana samo ta datoteka.

Če neke datoteke ne želiš vključit v repozitorij jo vpišeš v datoteko .gitignore preden poženeš git add .
Ko je še nedodana datoteka vpisana v .gitignore izgine iz seznama, ki ga izpiše git status

O odstranjevanju datotek iz repozitorija kasneje.
Upoštevaj dejstvo, da je datoteka .gitignore del repozitorija!

Git commit

Na kratko: commit je vpis sprememb v repozitorij. Najpomembnejši git ukaz je git commit in poleg git status največkrat uporabljen.
Nikoli ne fališ, če ga napišeš takole

git commit -a -m "kratek opis sprememb" 

Argument -a pomeni da dodajaš vse spremembe in izbrise (vendar -a ni bljižnjica za git add!!, -a ne doda datotek, ki še niso v repoju). -m pomeni message.

Git commit ima kup drugih možnosti, ki jih jaz ne uporabljam, si jih je pa dobro vsaj prebrat tukaj http://www.kernel.org/pub/software/scm/git/docs/git-commit.html

Opis sprememb naj bo kratek, jedrnat in naj pove nekaj vsebinskega. Profiji priporočajo dolžino od 30 do 60 znakov, izjemoma več. Ni potrebno vpisati vsega kar si delal (to si lahko vsak pogleda z git diff ) ali preprosteje tukaj na gitlabu, potrebno je napisati samo kaj si naredil.

Commiti naj bodo pogosti. Več kot je commitov lažje je slediti specifičnim spremembam.

Dodana metoda je že razlog za commit, ali funkcionalnost, ali popravek kode (manjši bugfix), tudi dokumentiranje je lahko razlog za commit. Koda, ki jo commitaš ni nujno 100% preizkušena, dovolj je da nima sintaktičnih napak, torej da gre skozi parser.

Delo z oddaljenimi repozitoriji

Git remote

git remote uporabljen brez argumentov izpiše seznam oddaljenih repozirotijev. Večinoma je edini oddaljeni repozitorij origin Ime origin se uporablja po konvenciji, lahko bi ga preimenoval v karkoli. Origin je repozitorij iz katerega izvira koda, npr. [email protected](ime ali ip hosta):pot/do/projekta/ime-projekta.git (gituser je ponavadi git, kadar se uporablja gitlite ali gitlab). Origin je v resnici alias za ta string.
Če želiš izpisati podrobnosti (naslove) uporabi git remote -v

Git push

S tem ukazom spremembe porineš določen branch v določen oddaljeni repozitorij, seveda samo če imaš za to ustrezna pooblastila.
Preden narediš push obvezno preveri v kateri veji se nahajaš in izvedi ukaz git status Na delaj pusha, če git status ne odgovori

#On branch ime-veje
nothing to commit (working directory clean)

sicer obstaja kar nekaj možnosti, da boš naredil neumnost, ki zaradi genialnosti gita sicer ne bo usodna, ti bo pa pobrala kar nekaj dragocenega časa. Seveda pa to lahko narediš, če veš kaj delaš in zakaj.

Sintaksa za git push je preprosta

git push origin ime-veje

kar pomeni da porivaš vejo “ime-veje” v repozitorij origin. Če veja na oddaljenem repozitoriju obstaja, bo narejen avtomatski merge (če je možen …)
Nekaj možnih zapletov:
1. Če nimaš pooblastil za push v določen branch, ker je na repozitoriju zaščiten, boš dobil ustrezno obvestilo. V tem primeru lahko narediš novo lokalno vejo in slednjo porineš v repo.
2. Če je vejo na oddaljenem repozitoriju nekdo spreminjal, te bo git opozoril, da obstaja možnost konfliktov. V tem primeru moraš najprej narediti git pull origin ime-veje. Če imaš srečo in ni konfliktov bo merge narejen lokalno in boš lahko takoj za tem naredil push. V nasprotnem primeru boš moral mergat ročno, kar je nekoliko bolj zoprno ampak z orodjem kot je npr. meld, tudi ne boli.

Git pull

Z ukazom

git pull origin ime-veje 

snameš in oddaljeno vejo z repozitorija in jo mergaš v svojo. V primeru konfliktov, moraš merge narediti ročno.

Git fetch

Uporabe tega ukaza ne priporočam, dokler nimaš vsaj nekaj izkušenj.

Z ukazom

git fetch origin 

Snameš vse veje z repoozitorija origin. Če dodaš ukazu še ime veje, snameš samo tisto vejo, Razlika med fetch in pull je v tem, da se pri fetchu ne izvede merge, zato moraš po tem, ko izvedeš fetch narediti še git checkout izbrana-veja ali git merge

Razvejanje in združevanje

Največja moč gita je v preprostosti ustvarjanja in združevanja vej zato je pogosto pametno posamezne funkcionalnosti programirat v različnih vejah.

Git branch

Brez dodatnih argumentov git branch prikaže vse veje projekta in z zvezdico označi aktivno vejo.
Novo vejo ustvariš z git branch ime-nove-veje
Obstoječo vejo brišeš z git branch -d ime-veje Pazi! Git briše veje brez opozorila
Ker veje ne zavzemajo posebno veliko prostora (git shranjuje spremembe), se opuščenih vej ne splača brisati. Brsati se splača le vejo, ki smo jo združili z drugo vejo.

Git checkout

Ta ukaz uporabljamo za preklapljanje med vejami. Za preklop na drugo vejo vtipkamo git checkout ime-veje
Pozor! Če delovni direktorij vsebuje spremembe, ki še niso bile commitane, bodo te spremembe ob preklopu veje povožene!
Pred uporabo git checkout obvezno preveri git status in po potrebi git commit

Git merge

Ta ukaz se uporablja za združevanje vej. Najprej izberemo vejo v katero vključujemo, nato izvedemo merge:

git checkout moja-glavna-veja 

git merge stranska-veja

Tako moja-glavna-veja vsebuje stransko vejo. Seveda če ni bilo konflikotv. V primeru konfliktov (git zavrne merge) je potrebno narediti ročni merge. Jaz ga najraje delam z grafičnim orodijem (Meld, Kdiff … seveda mora biti program inštaliran), ki ga poženem iz gita git mergetool Odpre se trojna primerjava datotek. Tvoja naloga je, da so nakoncu vse tri identične.

Privzet mergetool nastaviš z git config --global merge.tool meld

Če se konfliktov ustrašiš in ne želiš tega opraviti sam, lahko merge prekličeš z ukazom git merge --abort pushaš obe veji v repo in prosiš koga drugega, da naredi merge, ali pa da ti pri tem pomaga.

Za bolj komplicirane in večje merge je dobro vedeti čimveč:
http://www.kernel.org/pub/software/scm/git/docs/git-merge.html

Git diff

git diff je priročen ukaz za primerjavo glav, verzij, vej, tagov in morda še česa. Če ga uporabiš brez argumentov prikaže vse spremembe necommitane delovne verzije z zadnjim commitom. Če ga uporabiš z imenom datoteke git diff index.php prikaže razlike med delavno verzijo datoteke in zadnjo commitano verzijo datoteke.

Uporabljaš ga lahko za pregled razlik med commiti git diff commit1 commit1 (pri čemer sta commit1 in commit2 hex številki commitov ki jih najdeš z git log ), razlik med vejami git diff ena-veja druga-veja ali razlik med tagi git diff ime-taga1 ime-taga2

Tagi so človeku razumljiva imena za posamezne točke znotraj ene veje in niso nujno potrebni, zato jih tukaj ne bom obravnaval. Več o tagih: http://git-scm.com/book/en/Git-Basics-Tagging

Več o ukazu diff http://www.kernel.org/pub/software/scm/git/docs/git-diff.html

Zaključek in reference

Tako, to je verjetno vse in celo nekoliko več, kot moraš vedeti o gitu za osnovno delo. Na netu je precej dobrih virov.
– Uradna dokumentacija je precej jasna http://www.kernel.org/pub/software/scm/git/docs/
– Odličen morda bolj razumljiv vir pa je tole http://gitref.org/

Objavljeno v git