Razširi povzetek
This commit is contained in:
parent
071fd96414
commit
eec4c82dd6
2 changed files with 4364 additions and 3153 deletions
7370
git-obzornik.pdf
7370
git-obzornik.pdf
File diff suppressed because it is too large
Load diff
147
git-obzornik.typ
147
git-obzornik.typ
|
|
@ -5,7 +5,7 @@
|
|||
#show link: set text(blue)
|
||||
#import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge
|
||||
#import fletcher.shapes: house, chevron, pill
|
||||
#import "definicije.typ": file-object, tree-object, git-object
|
||||
#import "definicije.typ": file-object, tree-object, git-object, commit-object
|
||||
|
||||
#let note(content) = rect(stroke: none, width: 100%,
|
||||
text(style: "italic",
|
||||
|
|
@ -127,11 +127,12 @@ Git bo shranil naslednje objekte v vsebinsko naslovljivo shrambo:
|
|||
Git z uporabo zgoščene vrednosti kot kazalca na vsebino, vsebino direktorija postavi v podatkovno strukturo, ki jo matematično lahko opišemo z _usmerjenim acikličnim grafom_. Ko je vsebina
|
||||
datotek enaka(npr. `bla.txt` in `mapa/bla.txt`), Git shrani le eno kopijo, ki je dostopna v datoteki `.git/objects/bc/c1382241e267cf790ca6b3afe9fde6dcf1072f`. Zato datotečno drevo v Gitu ni nujno drevo, ampak usmerjen aciklični graf.
|
||||
|
||||
#let bla(coord, ..args) = file-object(coord, "bcc138", ..args)[bla]
|
||||
#let blabla(coord, ..args) = file-object(coord, "2ce22b", ..args)[blabla]
|
||||
|
||||
#figure(caption: [Primer datotečnega grafa povezanega z zgoščenimi vrednostmi],
|
||||
diagram(
|
||||
{
|
||||
let bla(coord, ..args) = file-object(coord, "bcc138", ..args)[bla]
|
||||
let blabla(coord, ..args) = file-object(coord, "2ce22b", ..args)[blabla]
|
||||
bla((-1, 0), name:<bla>)
|
||||
blabla((-1, 1), name: <blabla>)
|
||||
tree-object((1, 1), "e8cc59", name: <mapa>)[drevo]
|
||||
|
|
@ -164,7 +165,7 @@ V prejšnjem poglavju smo videli, kako Git hrani vsebino direktorija in kako je
|
|||
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. Podobno kot objekt tipa _drevo_, je tudi vnos objekt v vsebinsko naslovljivi shrambi, ki je ima določeno *zgoščeno vrednost vnosa*. Zgoščena vrednost vnosa je natanko določena z vsebino shranjenih datotek in metapodatkov vnosa.
|
||||
|
||||
|
||||
#figure(
|
||||
git-object("8dd6d4bdaeff93016bd49474b54a911131759648",
|
||||
"tree 65c47feec7465e80492620a48206793e078702e0
|
||||
|
|
@ -206,8 +207,38 @@ Vsak vnos je povezan s točno določenim posnetekom vsebine korenskega datotečn
|
|||
caption: [Vnosi v Gitu kot usmerjen graf. Vsak vnos(razen prvega) ima povezavo na vnose iz katerih izhaja.]
|
||||
)
|
||||
|
||||
Git hrani zgodovino sprememb v _vsebinsko naslovljivi shrambi objektov_, ki hrani tri vrste objektov:
|
||||
- `blob`: vsebina datotek,
|
||||
- `tree`: vsebina direktorijev,
|
||||
- `commit`: posnetek vsebine v določenem trenutku.
|
||||
Objekti so poevazni v _usmerjen aciklični graf_. Podgraf na vnosih določa zgodovino sprememb. Naslovi objektov so _zgoščene vrednosti_ vsebine objekta, zato je zagotovljena verodostojnost shranjenih podatkov.
|
||||
|
||||
#figure(
|
||||
caption: [Vsebinsko naslovljiva shramba objektov v Gitu. Naslovi so zgoščene vrednosti vsebine. Shramba vsebuje dva vnosa. V prvem vnosu smo dodali dve datoteki `bla.txt` in `blabla.txt`, v drugem vnosu pa smo spremenili le vsebino datotoeke `bla.txt`.],
|
||||
diagram(
|
||||
{
|
||||
node((0, -1))[vsebina (blob)]
|
||||
node((2, -1))[drevesa (tree)]
|
||||
node((4, -1))[vnosi (commit)]
|
||||
bla((0, -0.5), name:<bla>)
|
||||
blabla((0, 0.5), name:<blabla>)
|
||||
file-object((0, 1.5),"33476f", name:<bla1>)[bla!]
|
||||
tree-object((2, 0), "ae12fg", name:<koren0>)[koren]
|
||||
tree-object((2, 1), "32e4f1", name: <koren1>)[koren]
|
||||
commit-object((4, 0), "7e43a1", name: <commit0>)[Prvi vnos]
|
||||
commit-object((4, 1), "4ef531", name: <commit1>)[Popravi bla.txt]
|
||||
edge(<commit0>, <koren0>, "->")
|
||||
edge(<commit1>, <koren1>, "->")
|
||||
edge(<commit1>, <commit0>, "->")[starš]
|
||||
edge(<koren0>, <bla>, "->")[bla.txt]
|
||||
edge(<koren1>, <bla1>, "->", label-angle: auto)[bla.txt]
|
||||
edge(<koren0>, <blabla>, "->", label-angle: auto)[blabla.txt]
|
||||
edge(<koren1>, <blabla>, "->", label-angle: auto)[blabla.txt]
|
||||
edge(<commit0>, <koren0>, "->")
|
||||
|
||||
}
|
||||
)
|
||||
)
|
||||
= Kazalci: veje in značke
|
||||
|
||||
Poleg objektov kot so _vnosi_, _posnetki direktorijev_ in _posnetki datotek_ pozna git še reference. Reference so kazalci z določenim imenom na posamezen vnos.
|
||||
|
|
@ -285,28 +316,100 @@ Vse te pomene damo vejam ljudje, ki sodelujemo v nekem Git repozitoriju. Za Git
|
|||
edge(<main>, <commit3>, "->")
|
||||
}
|
||||
),
|
||||
caption: [*HEAD* je referenca na trenutno aktiven vnos/vejo.]
|
||||
caption: [*HEAD* je referenca na trenutno aktiven vnos. _Index_ vsebuje spremembe, ki bodo zabeležene v naslednjem vnosu.]
|
||||
)
|
||||
|
||||
== Povzetek
|
||||
Samostalniki:
|
||||
- *Vnos* (angl. *commit*) je posnetek trenutnega stanja projekta, shranjen kot vozlišče v zgodovinskem grafu (DAG), ki vsebuje spremembe datotek ter metapodatke (avtor, čas, sporočilo).
|
||||
- *Zgoščena vrednost vnosa* (angl. *commit hash*) je 40-mestna heksadecimalna vrednost, izračunana s SHA-1, ki enolično identificira vnos na podlagi njegove vsebine.
|
||||
- *Veja* (angl. *branch*) je premična oznaka, ki kaže na določen vnos v zgodovini in se samodejno premakne naprej, ko dodajamo nove vnose. Veje omogočajo vzporedne razvojne linije z različnimi spremembami.
|
||||
- *Oznaka* (angl. *tag*) je statična oznaka, ki trajno kaže na določen vnos. Za razliko od veje se oznaka, nikoli ne premika samodejno, zato se uporablja predvsem za označevanje pomembnih točk v zgodovini, kot so izdaje ali stabilne verzije.
|
||||
- *Delovna kopija* (angl. *workout copy*) je direktorij v katerem urejamo datoteke, ki jih nato vnesemo v Git. V delovni kopiji imajo na začetku datoteke isto vsebino kot je vsebina trenutno aktivnega vnosa (`HEAD`). Spremembe, ki jih naaredimo na delovni kopiji lahko zabeležimo v nov vnos.
|
||||
- *Oddaljen repozitorij* (angl. *remote*) je povezava(url) na oddaljen repozitorij, s katerim izmenjujemo vsebino.
|
||||
|
||||
Glagoli (akcije):
|
||||
- *Checkout* prenese vsebino vnosa v delovno kopijo: `git checkout neka-veja`
|
||||
- *Commit* ustvari nov vnos: `git commit -m 'Sporočilo'`
|
||||
- *Add* doda vsebino, ki bo v naslednjem vnosu: `git add dodaj_me.txt`
|
||||
- *Pull* poberi vsebino iz oddaljenega repozitorija in uskladi lokalno vejo z oddaljeno: `git pull`
|
||||
- *Push* potisni lokalne vnose na oddaljeni repozitorij in uskladi oddaljeno vejo z lokalno: `git push`
|
||||
- *Fetch* pobere nove vnose, veje in oznake iz oddaljenega repozitorija: `git fetch`
|
||||
- *Reset* spremeni kam kaže trenutno izbrana veja: `git reset a239f9e91`
|
||||
- *Merge* ustvari nov vnos, ki združi dve ločeni veji v eno: `git merge main`
|
||||
- *Rebase* prestavi vnose v trenutno izbrani veji na izbran vnos: `git rebase main`
|
||||
Povzemimo sedaj, kaj smo spoznali o podatkovnem modelu Gita.
|
||||
V vsebinsko naslovljivi shrambi hrani Git posnetke stanja direktorija, ki ga vodimo v repozitoriju skupaj z metapodatki o spremembah. Najpomembnejša pojma sta:
|
||||
- *Vnos* (angl. *commit*) je posnetek trenutnega stanja projekta, shranjen kot vozlišče v zgodovinskem grafu, ki vsebuje posnetek stanja datotek ter metapodatke (avtor, čas, sporočilo).
|
||||
- *Zgoščena vrednost vnosa* (angl. *commit hash*) je 40-mestna heksadecimalna vrednost, izračunana s SHA-1, ki enolično identificira vnos na podlagi vsebine posnetka in metapodatkov.
|
||||
|
||||
Izven shrambe objektov hrani Git še reference na posamezne vnose. Poznamo dve vrsti referenc:
|
||||
- *Veja* (angl. *branch*) je premična reference, ki kaže na določen vnos v zgodovini in se samodejno premakne naprej, ko dodajamo nove vnose. Veje omogočajo vzporedne razvojne linije ki so med sabo neodvisne.
|
||||
- *Oznaka* (angl. *tag*) je statična referenca, ki trajno kaže na določen vnos. Za razliko od veje se oznaka, nikoli ne premika samodejno, zato se uporablja predvsem za označevanje pomembnih točk v zgodovini, kot so izdaje ali stabilne verzije.
|
||||
- *HEAD* je posebna oznaka, ki kaže na trenutno aktiven vnos v delovni kopiji.
|
||||
Omenimo še dva pojma, ki jih uporabljamo pri delu z Gitom:
|
||||
- *Delovna kopija* (angl. *workout copy*) je direktorij v katerem urejamo datoteke, ki jih nato vnesemo v Git. V delovni kopiji imajo na začetku datoteke isto vsebino kot je vsebina trenutno aktivnega vnosa (`HEAD`). Spremembe, ki jih naaredimo na delovni kopiji lahko zabeležimo v nov vnos.
|
||||
- *Oddaljen repozitorij* (angl. *remote*) je povezava(url) na isti repozitorij na drugem računalniku(ponavadi strežniku), s katerim lahko izmenjujemo vsebino.
|
||||
|
||||
= Git ukazi kot operacije na grafu
|
||||
|
||||
Ko smo opremljeni z razumevanjem podatkovnega modela Gita, razložimo kaj pomenijo posamezne operacije, ki jih Git omogoča. Ukazov ne bom prevajal, ampak jih bom navedel kot jih pozna program `git`.
|
||||
|
||||
== Checkout
|
||||
|
||||
Ukaz
|
||||
```
|
||||
git checkout referenca
|
||||
```
|
||||
spremeni datoteke v delovni kopiji tako, da se ujemajo z vnosom, na katerega kaže referenca. Poleg tega
|
||||
prestavi oznako `HEAD` na isti vnos. Če je referenca veja, jo nastavi, kot aktivno vejo. Če je referenca oznaka ali zgoščena vrednost vnosa, priedmo v stanje brez aktivne veje (angl. _deteached HEAD_).
|
||||
|
||||
== Commit
|
||||
Ukaz
|
||||
```
|
||||
git commit -m "Sporočilo za vnos"
|
||||
```
|
||||
ustvari nov vnos, ki kaže na stanje v čakalnici (angl. staging area ali index). V zgodovinskem grafu ustvari novo
|
||||
vozlišče, ki je povezano s prejšnjim vnosom. Poleg tega prestavi aktivno vejo in oznako `HEAD` na novo ustvarjeni vnos.
|
||||
== Add
|
||||
Ukaz
|
||||
```
|
||||
git add bla.txt
|
||||
```
|
||||
doda vsebino spremenjene datoteke `bla.txt` v čakalnico. Ukaz ne
|
||||
spreminja zgodovinskega grafa, pač pa doda novo vsebino in datotečna drevesa, ki vsebujejo spremembe v shrambo objektov. Vsebina čakalnice bo zabeležena v naslednjem vnosu.
|
||||
|
||||
== Pull
|
||||
|
||||
Ukaz
|
||||
```
|
||||
git pull
|
||||
```
|
||||
pobere vsebino(objekte in reference) iz oddaljenega repozitorija in uskladi lokalno vejo z oddaljeno.
|
||||
Shrambi objektov se preprosto doda nove objekte, ki so v oddaljeni veji. Če je lokalna veja prednik oddaljene, se lokalna veja enostavno prestavi, da kaže na isti vnos, kot oddaljena veja. V nasprotnem primeru, mora uporabnik posredovati in razrešiti morebitne konflikte.
|
||||
|
||||
== Push
|
||||
Ukaz
|
||||
```
|
||||
git push
|
||||
```
|
||||
|
||||
potisne novo vsebino na oddaljeni repozitorij. Push deluje obratno kot `pull`. Ukaz je uspešno izveden le, če je oddaljena veja prednica lokalne veje in ni konflikotov.
|
||||
|
||||
== Fetch
|
||||
|
||||
Ukaz
|
||||
```
|
||||
git fetch
|
||||
```
|
||||
pobere novo vsebino (vnose, veje in oznake) iz oddaljenega repozitorija. Pri tem ne more priti do konfliktov, ker
|
||||
git preprosto doda nove objekte v shrambo in obstoječih objektov nikakor ne spreminja. Oddaljenim vejam in oznakam
|
||||
preprosto doda predpono z imenom oddaljenega repozitorija.
|
||||
= Reset
|
||||
Ukaz
|
||||
|
||||
```
|
||||
git reset referenca
|
||||
```
|
||||
|
||||
spremeni kam kaže trenutno izbrana veja. Ukaz ne spremeni zgodovinskega drevesa, ampak le to, na kateri vnos kaže trenutno izbrana veja.
|
||||
|
||||
== Merge
|
||||
Ukaz
|
||||
```
|
||||
git merge referenca
|
||||
```
|
||||
ustvari nov vnos, ki združi dve ločeni veji v eno (trenutno izbrano in referenco). Nov vnos ima dva starša: vnos na katerega kaže trenutna veja in vnos, na katerega kaže referenca. Če pride do konfliktov, jih mora uporabnik sam razrešiti, preden se ustvari nov vnos.
|
||||
== Rebase
|
||||
Ukaz
|
||||
```
|
||||
git rebase referenca
|
||||
```
|
||||
prestavi vnose v trenutno izbrani veji tako, da so potomci vnosa, na katerega kaže referenca. Med ukazi, ki smo jih spoznali, je ta ukaz edini, ki lahko povzroči izgubo podatkov. Običajno ukazi le dodajajo nove vnose in prestavljajo
|
||||
reference. Zato je večina ukazov v Gitu varna, v smislu, da jih lahko kasneje prekličemo in pridemo nazaj na prejšnje stanje. Ukaz `rebase` pa spremeni zgodovino in ga ne moremo preklicati, saj trenutne vnose nadomesti z novimi in stare vnose pobriše#footnote[Obstaja enostaven način, da tudi `rebase` lahko prekličemo. Na zadnji vnos, ki ga želimo prestaviti preprosto postavimo novo referenco(vejo ali oznako). To povzroči, da se stari vnosi ne pobrišejo tudi, ko se izvede ukaz `rebase`.].
|
||||
|
||||
== Delo z Git
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue