From a34aecc98ae7e9921f8a81ca65b7f9f3200f0bc3 Mon Sep 17 00:00:00 2001 From: Martin Vuk Date: Thu, 1 Jan 2026 21:50:16 +0100 Subject: [PATCH] =?UTF-8?q?Dodaj=20poglavje=20o=20zgo=C5=A1=C4=8Devalni=20?= =?UTF-8?q?funkciji?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- git-obzornik.typ | 49 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/git-obzornik.typ b/git-obzornik.typ index 653be83..cbc28a7 100644 --- a/git-obzornik.typ +++ b/git-obzornik.typ @@ -9,9 +9,10 @@ #let note(content) = rect(stroke: none, width: 100%, text(style: "italic", [Opomba\ ] + content)) -#let abstract(content) = par( - body: center[*Abstract*] + content -) +#let abstract(content) = align(center, + box(width: 80%, + align(center, [*Abstract*\ ]) + align(left, content) +)) #align(center)[ @@ -21,13 +22,8 @@ #v(2em) #abstract[ -Git je je program, ki omogoča vodenje različic datotek. V glavnem se uporablja za upravljanje z izvorno kodo pri razvoju računalniških programov. Mnogi med nami pa ga uporabljajo tudi pri pisanju besedil. Ogledali si bomo, kako Git deluje. Opisali bomo, kako -*zgoščevalno funkcijo*, *Merklejeva drevesa* in *usmerjeni aciklični grafi*, da ustvari vsebinsko naslovljivo shrambo objektov. - -*Cilj:* Razumeti _logiko_ Gita. Ko razumemo, kaj je v ozadju, lahko operacije, kot so `merge`, -`rebase` in `reset` preporsto razložimo s preoblikovanjem grafa in premikanjem kazalcev po grafu. - -*Čas branja:* 30 min +Git je program, ki omogoča vodenje zgodovine različic datotek v nekem direktoriju. V glavnem se uporablja za upravljanje z izvorno kodo pri razvoju računalniških programov. Mnogi med nami pa ga uporabljajo tudi pri pisanju besedil v _LaTeX_-u. Poleg tega, da Git hrani zgodovino sprememb, tudi omogoča da več ljudi hkrati sodeluje pri urejanju istih datotek. +Ogledali si bomo, kako Git deluje. Opisali bomo, kako Git uporabi _zgoščevalne funkcije_, _Merklejeva drevesa_ in _usmerjene aciklične grafe_, da shrani zgodovino različic in omogoči hkratno urejanje vsebine. Matematični model, ki ga Git uporablja je v resnici zelo preprost in njegovo razumevanje nas lahko reši marsikatere zagate, ki nastane med njegovo uporabo. ] = Kaj je Git? @@ -62,7 +58,38 @@ V nadaljevanju bomo obravnavali nasledjne teme: preklaplanje med različicami in preprečijo popolno zmešnjavo, ko več ljudi hkrati spreminja iste datoteke. = Podatkovno skladišče -== Vnos: posnetek stanja + +Ko ustvarimo nov Git repozitorij, Git ustvari direktorij z imenom `.git`, ki vsebuje vse podatke, ki jih Git potrebuje. Git v mapi `.git` hrani različne stvari: +- vsebino datotek, s ki smo jih dodali v repozitorij +- drevesno strukturo direktorija +- posnetke stanja v rezličnih trenutkih s podatki o avtoju, datumu in opisu sprememb +- kazalce na posamezne posnetke stanja + +Git repozitorij je vsak direktorij, ki vsebuje poddirektorij `.git` z zgoraj navedenimi podatki. + +== Zgoščevalna funkcija + +Git ne shranjuje datotek z običajnimi imeni, ampak za ime uporabi vrednost zgoščevalne funkcije njene vsebine. +Git uporablja zgoščevalno funkcijo _SHA-1_. + +Naj bo $B$ množica vseh možnih podatkovnih nizov(besedil). Zgoščevalna funkcija _SHA1_ je funkcija +$ + H: B -> {0, 1, dots, 2^(160)-1}, +$ +ki vsakemu besedilu $b$ priredi 160-bitno vrednost $H(b)$. Funkcija $H$, je izbrana tako, da +sprememba enega samega bita v besedilu $b in B$ spremeni vrednost $H(b)$. Poleg tega zahtevamo, da je porazdelitev vrednosti $H(b)$ čim bližje enakomerni porazdelitvi. To pomeni, da so vse vrednosti $H(b)$ približno enako verjetne. Kljub temu, da zgoščevalna funkcija $H$ +ni injektivna, je verjetnost, da bi imela dva podatkovna niza isto vrednost $H$ zelo majhna($approx 2^(-159)$). Zato lahko v praksi predpostavimo, da je z vrednostjo $H(b)$ niz $b$ enolično določen. + +Ko datoteko z vsebino $b$ zabeležimo v Git repozitorij, git shrani vsebino v datoteko z imenom $H(b)$ v `git/objects`#footnote[V resnici Git shrani vsebino v datoteko z imenom $h_3 h_4 dots h_(40)$ v mapi $h_1 h_2$, kjer je +$h_1 h_2 h_3 dots h_(40)$ zapis $H(b)$ v 16-tišlkem sistemu. Datoteka, katere vsebina ima vrednostjo $H(b)$ enako `8dd6d4bdaeff93016bd49474b54a911131759648` bo shranjena v `.git/objects/8d/d6d4bdaeff93016bd49474b54a911131759648`]. +Vsebina $b$ je tako vedno dostopna pod imenom $H(b)$. Tako dobimo _vsebinsko naslovljivo shrambo objektov_, ki je ena od bistvenih značilnosti Gita. Ta način shranjevanja omogoča, da lahko vedno preverimo, če ima shranjenjena vsebina isto vrednost zgoščevalne funkcije, kot je njeno ime. Lahko tudi shranimo več različic iste datoteke, saj ima vsaka različica drugačno zgoščevalno vrednost. Zgoščevalna vrednost služi tudi kot kontrola, če je prišlo do kvaritve podatkov, ki so shranjeni v Git repozitoriju. + +== Merklejeva drevesa + +V vsebinsko naslovljivo shrambo objektov lahko shranimo vsebino datotek in njihovih prejšnjih različic. A kako ohranimo informacijo o imenu datotek in drevesni strukturi direktorija? + +== Posnetki stanja + Osnovna enota v Gitu je *Vnos* (angl. *commit*). Vnos je posnetek stanja zabeleženih datotek v trenutku, ko je bil ustvarjen. Poleg vsebine datotek vsak vnos vsebuje še metapodatke o avtorju, datumu vnosa in opisom sprememb. Vsakemu vnosu je prirejena *zgoščena vrednost vnosa*, ki je 40-mestna heksadecimalna vrednost,