Git
Chapters ▾ 2nd Edition

1.3 Početak - Osnove Gita

Osnove Gita

Pa, šta je Git u osnovi? Veoma je važno shvatiti ovaj odeljak, jer ako razumete šta je Git i osnove njegovog funkcionisanja, onda će vam biti mnogo jednostavnije da koristite Git efikasno. Dok učite Git, probajte da zaboravite na stvari koje znate o mnogim drugim VCS-ovima, kao što su Subversion i Perforce; na taj način ćete izbeći neke suptilne nedoumice dok koristite ovaj alat. Git čuva i misli na podatke na mnogo drugačiji način od ostalih sistema, iako je korisnički interfejs veoma sličan, i razumevanje tih razlika će pomoći da ne dođe do zabune tokom njegovog korišćenja.

Snimci, ne razlike

Glavna razlika između Gita i drugih VCS-ova (uključujući Subversion i ekipu) je način na koji Git posmatra podatke. Konceptualno, većina drugih sistema čuva podatke kao listu promena fajlova. Ovi sistemi (CVS, Subversion, Perforce, Bazaar, i tako dalje) razmišljaju o podacima koje čuvaju kao o skupu fajlova i promena koje su napravljene nad njima tokom vremena.

Čuvanje podataka shvativši ih kao promene u odnosu na osnovnu verziju svakog fajla
Figure 4. Čuvanje podataka shvativši ih kao promene u odnosu na osnovnu verziju svakog fajla.

Git ne razmišlja o podacima na ovaj način, niti ih tako pamti. Umesto toga, Git gleda na podatke kao da su skup snimaka (snapshots) minijaturnog sistema. Svaki put kada izvršite komit (commit), ili sačuvate stanje svog projekta na Gitu, on u suštini uzima sliku onoga kako svi vaši fajlovi izgledaju u tom trenutku i pamti referencu na taj snimak. Da bi održao efikasnost, ako se fajl nije promenio, Git ne čuva fajl ponovo, već samo vezu ka prethodnom identičnom fajlu koji je već sačuvao. Git na podatke gleda kao na tok snimaka.

Čuvanje podataka shvativši ih kao snimke projekta tokom vremena
Figure 5. Čuvanje podataka shvativši ih kao snimke projekta tokom vremena.

Ovo je važna razlika između Gita i skoro svih drugih VCS-ova. Zbog ovoga Git drugačije gleda na skoro svaki aspekt kontrole verzije koji su većina ostalih sistema samo kopirali iz prethodne generacije. To čini Git minijaturnim fajl sistemom sa ugrađenim izuzetno moćnim alatima, a ne samo običnim VCS-om. Istražićemo neke prednosti koje dobijate čistim razmišljanjem o podacima na ovaj način dok budemo prelazili grananje u Gitu u Grananje u Gitu.

Skoro svaka operacija je lokalna

Većina operacija u Gitu zahteva samo lokalne fajlove i resurse da bi se izvršile - u opštem slučaju, nije potrebna nijedna informacija sa drugog računara na mreži. Ako ste naviknuti na CVCS-ove gde većina operacija ima zastoj zbog latencije mreže, ovaj aspekt Gita će vas uveriti u to da su bogovi brzine blagosiljali Git vanzemaljskim moćima. Pošto imate čitavu istoriju projekta odmah tu na lokalnom disku, većina operacija će se izvršiti skoro trenutno.

Na primer, da biste pregledali istoriju projekta, Git ne mora da ode na server da je preuzme da bi vam je prikazao — samo treba da je pročita direktno iz lokalne baze podataka. Ovo znači da ćete videti istoriju projekta istog trenutka. Ako želite da vidite izmene koje su unete u fajl između trenutne verzije i one od pre mesec dana, Git može da pogleda kako je fajl izgledao pre mesec dana i da uradi lokalno izračunavanje razlike, umesto da pita udaljeni server da uradi to ili da povuče stariju verziju fajla sa udaljenog servera i da izračuna razliku lokalno.

Ovo takođe znači da nema mnogo stvari koje ne možete da uradite dok niste prikačeni na mrežu ili na VPN. Ako se ukrcate na avion ili voz i želite da uradite nešto, možete da komitujete bez problema sve dok ne dođete do mrežne konekcije da gurnete podatke na server. Ako odete kući i ne možete da podesite VPN klijent da radi kako treba, i dalje možete da radite na projektu. Kod mnogih drugih sistema, ovakve stvari su nemoguće ili zahtevaju previše muke. Na primer, u Perforce-u, ne možete da uradite mnogo toga ako niste povezani sa serverom; a u Subversion-u i CVS-u, i dalje možete da menjate fajlove, ali ne možete da komitujete promene ka bazi podataka (jer je ona oflajn). Ovo možda ne izgleda kao velika stvar, ali iznenadili biste se kada vidite koliko ovakve stvari znače.

Git ima integritet

U Gitu se nad svim računa kontrolna suma (checksum) pre nego što se sačuva, a onda se stvarima pristupa koristeći tu kontrolnu sumu. To znači da je nemoguće promeniti sadržaj bilo kog fajla ili direktorijuma a da Git ne zna za to. Ova funkcionalnost je ugrađena u Git u najnižim slojevima i integralna je njegovoj filozofiji. Ne možete da izgubite podatke tokom tranzita ili da dođe do oštećenja fajlova a da Git to ne primeti.

Mehanizam koji Git koristi za kontrolnu sumu zove se SHA-1 heš (SHA-1 hash). Ovo je string od 40 karaktera koji se sastoji od heksadecimalnih cifara (0-9 i a-f) i računa se na osnovu sadržaja fajla ili strukture direktorijuma u Gitu. SHA-1 heš izgleda otprilike ovako:

24b9da6552252987aa493b52f8696cd6d3b00373

Videćete ove heš vrednosti posvuda u Gitu jer ih on dosta koristi. Zapravo, sve što Git čuva u bazu podataka čuva se na osnovu heš vrednosti sadržaja, a ne na osnovu imena fajla.

Git generalno samo dodaje podatke

Kada obavite neku akciju u Gitu, skoro sve one samo dodaju podatke u Gitovu bazu podataka. Teško je naterati sistem da uradi nešto što ne može da se opozove ili da obriše podatke na bilo koji način. Kao i kod bilo kog drugog VCS-a, možete da napravite grešku kod promena koje još nisu komitovane; ali nakon što komitujete snimak u Git, veoma je teško izgubiti ga, pogotovo ako redovno šaljete bazu podataka drugom repozitorijumu.

Ovo čini korišćenje Gita uživanjem jer znamo da možemo da eksperimentišemo bez brige da ćemo nešto upropastiti. Za malo detaljniji pogled na to kako Git čuva podatke i kako vratiti podatke koje ste naizgled izgubili, pogledajte Opovrgavanje.

Tri stanja

Sada obratite pažnju. Ovo je glavna stvar koju treba zapamtiti o Gitu ako želite da ostatak učenja teče kako valja. Git ima tri glavna stanja u kojima se vaši fajlovi mogu naći: komitovano, modifikovano i stejdžovano. Komitovano znači da su podaci smešteni u lokalnoj bazi podataka na sigurnom. Modifikovano znači da ste promenili fajl ali da ga još uvek niste komitovali u bazu podataka. Stejdžovano znači da ste označili modifikovani fajl da se u svom trenutnom stanju uključi u sledeći komit snimka koji budete napravili.

Ovo nas vodi do tri glavne sekcije Git projekta: Git direktorijum, radni direktorijum i stejdž.

Radni direktorijum, stejdž i Git direktorijum.
Figure 6. Radni direktorijum, stejdž i Git direktorijum.

Git direktorijum je mesto gde Git čuva sve metapodatke i objektnu bazu podataka za vaš projekat. Ovo je najvažniji deo Gita, i to je ono što se kopira kada klonirate repozitorijum sa drugog računara.

Radni direktorijum je jedan čekaut (checkout) jedne verzije projekta. Ovi fajlovi se dovlače iz kompresovane baze podataka iz Git direktorijuma i smeštaju se na disk da biste ih koristili i modifikovali.

Stejdž je fajl koji se obično nalazi u Git direktorijumu i čuva informacije o tome šta će se uključiti u sledeći komit. Ponekad se naziva “indeks”, ali se često koristi i naziv stejdž.

Osnovni tok rada sa Gitom ide nekako ovako:

  1. Modifikujete fajlove u radnom direktorijumu.

  2. Stejdžujete fajlove, odnosno dodajete njihove snimke na stejdž.

  3. Komitujete, što znači da uzmete fajlove u onoj verziji u kojoj su bili kada ste ih dodali na stejdž i te snimke trajno smeštate u Git direktorijum.

Ako se neka verzija fajla nalazi u Git direktorijumu, smatra se komitovanom. Ako je modifikovana i onda dodata na stejdž, ona je stejdžovana. A ako se promenila od čekauta ali nije stejdžovana, onda je modifikovana. U Osnove Gita, naučićete više o ovim stanjima i o tome kako se najbolje koriste, kao i kako da potpuno preskočite stejdž.