Posodobi uvod
This commit is contained in:
parent
4ae9fed0ec
commit
6546899abb
2 changed files with 1831 additions and 1582 deletions
3226
git-intro.pdf
3226
git-intro.pdf
File diff suppressed because it is too large
Load diff
163
git-intro.typ
163
git-intro.typ
|
|
@ -1,28 +1,49 @@
|
||||||
#set page("a4", margin: 20mm)
|
#set page("a4", margin: 20mm)
|
||||||
#set text(lang: "sl")
|
#set text(lang: "sl")
|
||||||
#show link: set text(blue)
|
#show link: set text(blue)
|
||||||
#import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge
|
#import "@preview/fletcher:0.5.8" as fletcher: diagram, edge, node
|
||||||
#import fletcher.shapes: house, chevron, pill
|
#import fletcher.shapes: chevron, house, pill
|
||||||
|
|
||||||
#let note(content) = rect(stroke: 0.5pt, width: 100%, fill: green.lighten(50%), content)
|
#let note(content) = rect(stroke: 0.5pt, width: 100%, fill: green.lighten(50%), content)
|
||||||
|
|
||||||
#include "git-figure.typ"
|
#include "git-figure.typ"
|
||||||
|
|
||||||
#align(center)[
|
#align(center)[
|
||||||
= Git za gike
|
= Git za matematike
|
||||||
]
|
]
|
||||||
Dokument opiše delovanje sistema za nadzor različic #link("https://git-scm.com/")[Git] za nekoga, ki želi vedeti,
|
#v(2em)
|
||||||
kako stvari delujejo.
|
|
||||||
|
Naučili se bomo, *kako Git deluje*. Spoznali bomo, da so v ozadju Gita
|
||||||
|
*vsebinsko naslovljiva shramba podatkov*, *Merklejeva drevesa* in *usmerjen aciklični graf*.
|
||||||
|
|
||||||
|
*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
|
||||||
|
|
||||||
== Kaj je Git?
|
== Kaj je Git?
|
||||||
|
|
||||||
#link("https://git-scm.com/")[Git] je sistem za upravljanje različic. Kaj to pomeni?
|
#link("https://git-scm.com/")[Git] je kot *časovni stroj* za datoteke. Uporabniku omogoča, da vidi *pretekle različice* datotek,
|
||||||
#note[Git hrani vsebino direktorija z datotekami in celotno zgodovino sprememb.
|
sprememinja datoteke, *brez skrbi, da bi kaj pokvaril* in datoteke *deli z drugimi*.
|
||||||
Zgodovina sprememb se hrani v obliki posnetkov celotne vsebine v določenih trenutkih.]
|
Git namreč hrani vsebino direktorija z datotekami in celotno zgodovino različic datotek iz preteklosti.
|
||||||
|
Za vsako različico hrani Git zapis o avtorju, datumu in opis sprememb, ki so nastale v primerjavi s predhodno
|
||||||
|
različico.
|
||||||
|
|
||||||
|
#note[
|
||||||
|
Sisteme, ki omogočajo hranjenje preteklih različic datotek, imenujemo
|
||||||
|
#link("https://en.wikipedia.org/wiki/Version_control")[sistemi za nadzor različic] (angl. version control system (VCS)) ali
|
||||||
|
_sistemi za upravljanje z izvorno kodo_ (angl. Source Code Management (SCM)).
|
||||||
|
|
||||||
|
Poleg nadzora različic Git omogoča, da datoteke spreminja več uporabnikov na različnih računalnikih hkrati.
|
||||||
|
Zato je Git #link("https://en.wikipedia.org/wiki/Distributed_version_control")[distribuiran sistem za nadzor različic]
|
||||||
|
(angl. Distributed Version Control System (DVCS)).
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
== Git repozitorij
|
== Git repozitorij
|
||||||
|
|
||||||
Git repozitorij je direktorij v katerem je poddirektorij `.git`, ki vsebuje vso zgodovino sprememb in ostale podatke, ki jih Git potrebuje.
|
Git repozitorij je direktorij v katerem je poddirektorij `.git`, ki vsebuje vso zgodovino sprememb in ostale podatke,
|
||||||
|
ki jih Git potrebuje.
|
||||||
|
|
||||||
== Vnos: posnetek stanja
|
== Vnos: posnetek stanja
|
||||||
Osnovna enota v Gitu je *vnos* (angl. *commit*). Vnos je posnetek stanja zabeleženih datotek v trenutku,
|
Osnovna enota v Gitu je *vnos* (angl. *commit*). Vnos je posnetek stanja zabeleženih datotek v trenutku,
|
||||||
|
|
@ -35,34 +56,43 @@ Vnose in vsebino datotek hrani Git v #link("https://git-scm.com/book/en/v2/Git-I
|
||||||
Do objektov v skladišču lahko dostopamo, če poznamo njihovo _zgoščeno vrednost_. Objekti, ki jih Git hrani v skladišču
|
Do objektov v skladišču lahko dostopamo, če poznamo njihovo _zgoščeno vrednost_. Objekti, ki jih Git hrani v skladišču
|
||||||
so *vnosi*, *posnetki direktorijev* in *posnetki posameznih datotek*.
|
so *vnosi*, *posnetki direktorijev* in *posnetki posameznih datotek*.
|
||||||
#figure(
|
#figure(
|
||||||
table(columns: 1, [*zgoščena vrednost*: 8dd6d4bdaeff93016bd49474b54a911131759648],
|
table(
|
||||||
```
|
columns: 1,
|
||||||
tree 65c47feec7465e80492620a48206793e078702e0
|
[*zgoščena vrednost*: 8dd6d4bdaeff93016bd49474b54a911131759648],
|
||||||
parent 16f2994757f1213935b8edb9ae7fee3a8e9ec98d
|
```
|
||||||
author MV <mv@example.com> 1765235698 +0100
|
tree 65c47feec7465e80492620a48206793e078702e0
|
||||||
committer MV <mv@example.com> 1765235698 +0100
|
parent 16f2994757f1213935b8edb9ae7fee3a8e9ec98d
|
||||||
|
author MV <mv@example.com> 1765235698 +0100
|
||||||
|
committer MV <mv@example.com> 1765235698 +0100
|
||||||
|
|
||||||
Dodaj bla
|
Dodaj bla
|
||||||
```,
|
```,
|
||||||
stroke: 1pt, align: left),
|
stroke: 1pt,
|
||||||
|
align: left,
|
||||||
|
),
|
||||||
caption: [Primer vnosa v Gitu. Vnos vsebuje zgoščeno vrednost posnetka direktorija(`tree`), zgoščeno vrednost
|
caption: [Primer vnosa v Gitu. Vnos vsebuje zgoščeno vrednost posnetka direktorija(`tree`), zgoščeno vrednost
|
||||||
starševskega vnosa (`parent`) in metapodatke. Tudi sam vnos je natančno določen z zgoščeno vrednostjo.],
|
starševskega vnosa (`parent`) in metapodatke. Tudi sam vnos je natančno določen z zgoščeno vrednostjo.],
|
||||||
)
|
)
|
||||||
Posnetki direktorijev so v Gitu posebne vrste objekti tipa `tree`. Vsebujejo zgoščene vrednosti in metapodatke o
|
Posnetki direktorijev so v Gitu posebne vrste objekti tipa `tree`. Vsebujejo zgoščene vrednosti in metapodatke o
|
||||||
datotekah in direktorijih, ki jih vsebuje.
|
datotekah in direktorijih, ki jih vsebuje.
|
||||||
#figure(table(columns: 1, stroke:1pt, [*zgoščena vrednost*: `d934342ca420dd0d9828782c7103103f2922d2a6`],
|
#figure(
|
||||||
```
|
table(
|
||||||
100644 blob 76018072e09c5d31c8c6e3113b8aa0fe625195ca bar.txt
|
columns: 1,
|
||||||
100644 blob ba0e162e1c47469e3fe4b393a8bf8c569f302116 foo.txt
|
stroke: 1pt,
|
||||||
040000 tree 3b8bfca88b2cc4127ce5909eb3a7395e8b5f2b6a podmapa
|
[*zgoščena vrednost*: `d934342ca420dd0d9828782c7103103f2922d2a6`],
|
||||||
```
|
```
|
||||||
),
|
100644 blob 76018072e09c5d31c8c6e3113b8aa0fe625195ca bar.txt
|
||||||
caption: [Primer posnetka direktorija v Gitu (objekt tipa `tree`). Posnetek vsebuje zgoščene vrednosti datotek in direktorija, ki jih vsebuje. Uporaba zgoščenih vrednosti natančno določa vsebino posnetka direktorija.])
|
100644 blob ba0e162e1c47469e3fe4b393a8bf8c569f302116 foo.txt
|
||||||
|
040000 tree 3b8bfca88b2cc4127ce5909eb3a7395e8b5f2b6a podmapa
|
||||||
|
```,
|
||||||
|
),
|
||||||
|
caption: [Primer posnetka direktorija v Gitu (objekt tipa `tree`). Posnetek vsebuje zgoščene vrednosti datotek in direktorija, ki jih vsebuje. Uporaba zgoščenih vrednosti natančno določa vsebino posnetka direktorija.],
|
||||||
|
)
|
||||||
#note[
|
#note[
|
||||||
Skladišča objektov v Gitu je
|
Skladišča objektov v Gitu je
|
||||||
#link("https://en.wikipedia.org/wiki/Content-addressable_storage")[skladišče vsebinsko naslovljivih objektov].
|
#link("https://en.wikipedia.org/wiki/Content-addressable_storage")[skladišče vsebinsko naslovljivih objektov].
|
||||||
Dostop do objekta je mogoč, če poznamo *zgoščeno vrednost* njegove vsebine. Dejansko je referenca na
|
Dostop do objekta je mogoč, če poznamo *zgoščeno vrednost* njegove vsebine. Dejansko je referenca na
|
||||||
posamezen objekt v Gitu preprosto zgoščena vrednost vsebine tega objekta. Poleg tega deluje zgoščena vrednost vsebine kot kontrolna vsota. To pomeni, da lahko enostavno preverimo verodostojnost vsebine, ki je shranjena v Gitu. Skladišče objektov je v direktoriju `.git/objects`.
|
posamezen objekt v Gitu preprosto zgoščena vrednost vsebine tega objekta. Poleg tega deluje zgoščena vrednost vsebine kot kontrolna vsota. To pomeni, da lahko enostavno preverimo verodostojnost vsebine, ki je shranjena v Gitu. Skladišče objektov je v direktoriju `.git/objects`.
|
||||||
]
|
]
|
||||||
== Zgodovinski graf sprememb
|
== Zgodovinski graf sprememb
|
||||||
Posamezni vnosi so povezani v *usmerjen acikličen graf* (angl. kratica *DAG*), ki ponazarja zgodovino sprememb.
|
Posamezni vnosi so povezani v *usmerjen acikličen graf* (angl. kratica *DAG*), ki ponazarja zgodovino sprememb.
|
||||||
|
|
@ -70,28 +100,25 @@ Vsak *vnos* je *vozlišče* v grafu in izhaja iz enega ali več starševskih vno
|
||||||
*Povezave* v grafu povezujejo vnose z njihovimi starši.
|
*Povezave* v grafu povezujejo vnose z njihovimi starši.
|
||||||
|
|
||||||
#figure(
|
#figure(
|
||||||
diagram(node-stroke: 1pt, node-shape: pill,
|
diagram(node-stroke: 1pt, node-shape: pill, {
|
||||||
{
|
let (Ah, Bh, Ch, Dh, Eh, Fh, Gh) = ("d93434", "2ca420", "dd0d98", "28782c", "710310", "3f2922", "d2a671")
|
||||||
let (Ah, Bh, Ch, Dh, Eh, Fh, Gh) = ("d93434", "2ca420", "dd0d98", "28782c", "710310", "3f2922","d2a671")
|
let (A, B, C, D, E, F, G) = ((0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (2, 1), (3, 1))
|
||||||
let (A, B, C, D, E, F, G) = ((0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (2, 1), (3, 1))
|
node(A, raw(Ah))
|
||||||
node(A, raw(Ah))
|
node(B, raw(Bh))
|
||||||
node(B, raw(Bh))
|
node(C, raw(Ch))
|
||||||
node(C, raw(Ch))
|
node(D, raw(Dh))
|
||||||
node(D, raw(Dh))
|
node(E, raw(Eh))
|
||||||
node(E, raw(Eh))
|
node(F, raw(Fh))
|
||||||
node(F, raw(Fh))
|
node(G, raw(Gh))
|
||||||
node(G, raw(Gh))
|
edge(B, A, "->")
|
||||||
edge(B, A, "->")
|
edge(C, B, "->")
|
||||||
edge(C, B, "->")
|
edge(D, C, "->")
|
||||||
edge(D, C, "->")
|
edge(E, D, "->")
|
||||||
edge(E, D, "->")
|
edge(G, F, "->")
|
||||||
edge(G, F, "->")
|
edge(F, B, "->")
|
||||||
edge(F, B, "->")
|
edge(D, F, "->")
|
||||||
edge(D, F, "->")
|
}),
|
||||||
|
caption: [Vnosi v Gitu kot usmerjen graf. Vsak vnos(razen prvega) ima povezavo na vnose iz katerih izhaja.],
|
||||||
}
|
|
||||||
),
|
|
||||||
caption: [Vnosi v Gitu kot usmerjen graf. Vsak vnos(razen prvega) ima povezavo na vnose iz katerih izhaja.]
|
|
||||||
)
|
)
|
||||||
|
|
||||||
== Reference: veje in značke
|
== Reference: veje in značke
|
||||||
|
|
@ -99,8 +126,7 @@ Vsak *vnos* je *vozlišče* v grafu in izhaja iz enega ali več starševskih vno
|
||||||
Poleg objektov kot so _vnosi_, _posnetki direktorijev_ in _posnetki datotek_ pozna Git še reference. Reference so kazalci z določenim imenom na posamezen vnos.
|
Poleg objektov kot so _vnosi_, _posnetki direktorijev_ in _posnetki datotek_ pozna Git še reference. Reference so kazalci z določenim imenom na posamezen vnos.
|
||||||
|
|
||||||
#figure(
|
#figure(
|
||||||
diagram(node-stroke: 0.5pt,
|
diagram(node-stroke: 0.5pt, {
|
||||||
{
|
|
||||||
node((2, -1), [main], shape: chevron, name: <main>)
|
node((2, -1), [main], shape: chevron, name: <main>)
|
||||||
node((-1, 0), [`e23d19`], shape: pill, name: <commit1>)
|
node((-1, 0), [`e23d19`], shape: pill, name: <commit1>)
|
||||||
node((0, 0), [`3943eb`], shape: pill, name: <commit2>)
|
node((0, 0), [`3943eb`], shape: pill, name: <commit2>)
|
||||||
|
|
@ -112,9 +138,8 @@ Poleg objektov kot so _vnosi_, _posnetki direktorijev_ in _posnetki datotek_ poz
|
||||||
edge(<commit4>, <commit3>, "->")
|
edge(<commit4>, <commit3>, "->")
|
||||||
edge(<main>, <commit4>, "->")
|
edge(<main>, <commit4>, "->")
|
||||||
edge(<tag>, <commit2>, "->")
|
edge(<tag>, <commit2>, "->")
|
||||||
}
|
}),
|
||||||
),
|
caption: [Veja (angl. branch) ali značka(angl. tag) je preprost kazalec na posamezen vnos(angl. commit). ],
|
||||||
caption: [Veja (angl. branch) ali značka(angl. tag) je preprost kazalec na posamezen vnos(angl. commit). ]
|
|
||||||
)
|
)
|
||||||
|
|
||||||
Referenc Git ne hrani v skladišču objektov, temveč posebej v direktoriju `.git/refs`. Zato so reference vezane na posamezen repozitorij in se lahko razlikujejo med različnimi kloni določenega repozitorija.
|
Referenc Git ne hrani v skladišču objektov, temveč posebej v direktoriju `.git/refs`. Zato so reference vezane na posamezen repozitorij in se lahko razlikujejo med različnimi kloni določenega repozitorija.
|
||||||
|
|
@ -124,9 +149,8 @@ Referenc Git ne hrani v skladišču objektov, temveč posebej v direktoriju `.gi
|
||||||
*Značka* (angl. *tag*) je referenca, ki je statična in se ne premika več, ko jo enkrat ustvarimo.
|
*Značka* (angl. *tag*) je referenca, ki je statična in se ne premika več, ko jo enkrat ustvarimo.
|
||||||
|
|
||||||
#figure(
|
#figure(
|
||||||
diagram(node-stroke: 0.5pt,
|
diagram(node-stroke: 0.5pt, {
|
||||||
{
|
node((1, -1), [main], shape: chevron, name: <main-old>, stroke: (dash: "dotted"))
|
||||||
node((1, -1), [main], shape: chevron, name: <main-old>, stroke:(dash: "dotted"))
|
|
||||||
node((-1, 0), [`e23d19`], shape: pill, name: <commit1>)
|
node((-1, 0), [`e23d19`], shape: pill, name: <commit1>)
|
||||||
node((0, 0), [`3943eb`], shape: pill, name: <commit2>)
|
node((0, 0), [`3943eb`], shape: pill, name: <commit2>)
|
||||||
node((1, 0), [`98ff21`], shape: pill, name: <commit3>)
|
node((1, 0), [`98ff21`], shape: pill, name: <commit3>)
|
||||||
|
|
@ -139,22 +163,20 @@ Referenc Git ne hrani v skladišču objektov, temveč posebej v direktoriju `.gi
|
||||||
edge(<main-old>, <commit3>, "->", stroke: (dash: "dotted"))
|
edge(<main-old>, <commit3>, "->", stroke: (dash: "dotted"))
|
||||||
edge(<tag>, <commit3>, "->")
|
edge(<tag>, <commit3>, "->")
|
||||||
edge(<main>, <commit4>, "->")
|
edge(<main>, <commit4>, "->")
|
||||||
}
|
}),
|
||||||
),
|
caption: [Ko ustvarimo nov vnos, se aktivna veja `main` premakne naprej, značka `v-1.0` pa ostane tam, kjer je bila. ],
|
||||||
caption: [Ko ustvarimo nov vnos, se aktivna veja `main` premakne naprej, značka `v-1.0` pa ostane tam, kjer je bila. ]
|
|
||||||
)
|
)
|
||||||
|
|
||||||
#note[
|
#note[
|
||||||
Veje in značke nimajo v Gitu nobenega posebnega pomena, razen tega, da so reference na vnose. Pomen posamenznih vej je stvar dogovora med uporabniki. Tako se pogosto uporablja različne veje za različne namene: `main` ali `master` je navadno glavna veja razvoja, veje z imeni `stable`, `production`, `development` in podobno označujejo različne stopnje razvoja programske opreme, veje s predpono `feature-` označujejo razvoj novih funkcionalnosti.
|
Veje in značke nimajo v Gitu nobenega posebnega pomena, razen tega, da so reference na vnose. Pomen posamenznih vej je stvar dogovora med uporabniki. Tako se pogosto uporablja različne veje za različne namene: `main` ali `master` je navadno glavna veja razvoja, veje z imeni `stable`, `production`, `development` in podobno označujejo različne stopnje razvoja programske opreme, veje s predpono `feature-` označujejo razvoj novih funkcionalnosti.
|
||||||
|
|
||||||
Vse te pomene damo vejam ljudje, ki sodelujemo v nekem Git repozitoriju. Za Git so vse veje in značke zgolj preprosti kazalci na določen vnos.
|
Vse te pomene damo vejam ljudje, ki sodelujemo v nekem Git repozitoriju. Za Git so vse veje in značke zgolj preprosti kazalci na določen vnos.
|
||||||
]
|
]
|
||||||
|
|
||||||
*HEAD* je posebna referenca, ki kaže na trenutno aktiven vnos. Vnos, na katerega kaže _HEAD_ bo starševski vnos naslednjeg vnosa, ki ga bomo dodali.
|
*HEAD* je posebna referenca, ki kaže na trenutno aktiven vnos. Vnos, na katerega kaže _HEAD_ bo starševski vnos naslednjeg vnosa, ki ga bomo dodali.
|
||||||
|
|
||||||
#figure(
|
#figure(
|
||||||
diagram(node-stroke: 0.5pt,
|
diagram(node-stroke: 0.5pt, {
|
||||||
{
|
|
||||||
node((-1, 0), [`e23d19`], shape: pill, name: <commit1>)
|
node((-1, 0), [`e23d19`], shape: pill, name: <commit1>)
|
||||||
node((0, 0), [`3943eb`], shape: pill, name: <commit2>)
|
node((0, 0), [`3943eb`], shape: pill, name: <commit2>)
|
||||||
node((1, 0), [`98ff21`], shape: pill, name: <commit3>)
|
node((1, 0), [`98ff21`], shape: pill, name: <commit3>)
|
||||||
|
|
@ -169,9 +191,8 @@ Vse te pomene damo vejam ljudje, ki sodelujemo v nekem Git repozitoriju. Za Git
|
||||||
edge(<index>, <commit4>, "->", stroke: (dash: "dotted"))
|
edge(<index>, <commit4>, "->", stroke: (dash: "dotted"))
|
||||||
edge(<head>, <commit3>, "->")
|
edge(<head>, <commit3>, "->")
|
||||||
edge(<main>, <commit3>, "->")
|
edge(<main>, <commit3>, "->")
|
||||||
}
|
}),
|
||||||
),
|
caption: [*HEAD* je referenca na trenutno aktiven vnos/vejo.],
|
||||||
caption: [*HEAD* je referenca na trenutno aktiven vnos/vejo.]
|
|
||||||
)
|
)
|
||||||
|
|
||||||
== Delo z Git
|
== Delo z Git
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue