Git
Chapters ▾ 2nd Edition

10.1 Git iznutra - Vodovod i porcelan

Možda se skočili direktno na ovo poglavlje od prethodnog, ili ste možda stigli ovde nakon što ste pročitali celu knjigu — u svakom slučaju, ovde ćemo da pogledamo kako Git radi iznutra i kako je implementiran. Mislimo da je učenje ovih aspekata Gita fundamentalno za razumevanje koliko je Git koristan i možan alat, ali su neki zauzeli drugačiji stav, vodeći se time da to može dovesti početnike do zabune, i da je preterano složena materija za njih. Zato smo našli kompromis i odlučili da ovo bude poslendnje poglavlje u knjizi kako biset mogli da ga pročitate pre ili kasnije tokom učenja. Na vama je da odlučite.

Sada kada ste ovde, vreme je da krenemo. Prvo, ako ovo još uvek nije jasno, Git je u osnovi datotečni sistem, adresabilan po sadržaju sa VCS korisničkim interfejsom napisanim povrh svega. Uskoro ćete naučiti detaljnije na šta se misli pod ovime.

U ranim danima Gita (uglavnom pre verzije 1.5), korisnički interfejs je bio mnogo složeniji jer je naglašavao da je ovo datotečni sistem a ne doteran VCS. U poslednjih nekoliko godina, UI je toliko unapređen da je njegovo korišćenje psotalo dosta jednostavno; mada često i dalje kruže stereotipi o tome kako je Git previše kompleksan i težak za učenje.

Sloj datotečnog sistema adresibilnog po sadržaju je neverovatno kul stvar, pa ćemo prvo obraditi njega u ovom polgavlju; posle toga ćete naučiti nešto o prenosnim mehanizmima i zadacima vezanim za održavanje repozitorijuma u koje ćete kad-tad možda morati da se upustite.

Vodovod i porcelan

Ova knjiga pokriva kako se Git koristi pomoću nekih tridesetak glagola kao što su checkout, branch, remote, i tako dalje. Ali zato što je Git prvobitno bio alat za VCS a ne izglancana verzija VCA-a, ima mnogo drugih glagola koji rade stvari na niskom nivou koji su dizajnirani da bi se ulančali u UNIX stilu ili da bi se zvali iz skripti. Ove komande se obično zovu "vodovodne komande", a komande koje su više prijateljski nastrojene korisnicima se zovu "porcelanske komande".

Prvih devet poglavlja knjige bavilo se skoro isključivo portcelanskim komandama. Ali u ovom poglavlju ćemo se baviti uglavnom vodovodnim komandama niskog nivoa, jer nude pristup unutrašnjoj strani Gita, i pomažu pri demonstraciji kako i zašto Git radi ono što radi. Mnoge od ovih komandi nisu namenjene da se koriste direktno iz komandne linije, već da se koriste kao gradivni blokovi za nove alate i skripte.

Kada pokrenete git init u novom ili postojećem direktorijumu, Git kreira direktorijum .git i njega koristi za manipulaciju i čuvanje skoro svega čime barata. Ako želite da sačuvate rezervu repozitorijuma ili da ga klonirate, kopiranje ovog jednog direktorijuma na drugo mesto vam daje skoro sve što vam je potrebno. Celo ovo poglavlje se bavi stvarima koje se nalaze u ovom direktorijumu. Evo kako on izgleda.

$ ls -F1
HEAD
config*
description
hooks/
info/
objects/
refs/

Možda ćete ovde videti i neke druge fajle, ali ovo je tek git init-ovan repozitorijum — ovako stvari izgledaju po podrazumevanim podešavanjima. Datoteku description koristi samo program GitWeb, tako da nema potrebe da brinete o njoj. Datoteka config sadrži konfiguracione opcije specifične za projekat, a direktorijum info drži globalnu datoteku exclude sa šablonima za ignorisanje koje ne želite da čuvate u datoteci .gitignore. Direktorijum hooks sadrži skripte za klijentsku i serversku stranu, o kojima se detaljno govori u Git hukovi.

Stoga nam preostaju još četiri vitne stavke: datoteke HEAD i index (koji će tek biti kreiran), kao i direktorijumi objects i refs. Oni predstavljaju srž Gita. Direktorijum objects čuva sav sadržaj za bazu podataka, direktorijum refs čuva pokazivače na komit-objekte iz tih podataka (grane), datoteka HEAD pokazuje na granu koja je trenutno čekautovana, i datoteka index je gde Git čuva informacije o stejdžu. Sada ćemo detaljno da pogledamo kako Git radi nad ovim podacima.