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. gituser@(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/