forked from tkrajina/uvod-u-git
-
Notifications
You must be signed in to change notification settings - Fork 0
/
git-branch.tex
executable file
·141 lines (87 loc) · 6.25 KB
/
git-branch.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
\chapter*{Grananje}
\addcontentsline{toc}{chapter}{Grananje}
Još jednom ćemo početi s ovim, već viđenim, grafom:
\input{graphs/primjer_s_imenovanim_granama_i_spajanjima}
Ovaj put s jednom izmjenom, svaka "grana" ima svoj naziv: \verb+novi-feature+, \\ \verb+ispravak-problema-x+ i \verb+master+.
U uvodnom poglavlju je opisan jedan od mogućih scenarija koji je mogao dovesti do ovog grafa.
Ono što je ovdje važno još jednom spomenuti je sljedeće; svaki čvor grafa je stanje projekta u nekom trenutku njegove povijesti.
Svaka strelica iz jednog u drugi čvor je izmjena koju je programer napravio i snimio u nadi da će dovesti do željenog ponašanja aplikacije.
\section*{Popis grana projekta}
\addcontentsline{toc}{section}{Popis grana projekta}
Jedna od velikih prednosti gita je što omogućuje jednostavan i brz rad s višestrukim granama.
Želimo li vidjeti koje točno grane našeg projekta trenutno postoje -- naredba je \verb+git branch+.
U većini slučajeva, rezultat te naredbe će biti:
\input{git_output/git_branch_s_jednom_granom}
To znači da naš projekt trenutno ima samo jednu granu.
\textbf{Svaki git repozitorij u početku ima jednu jedinu granu i ona se uvijek zove} \verb+master+.
Ukoliko smo naslijedili projekt kojeg je netko prethodno već granao, dobiti ćemo nešto kao:
\input{git_output/git_branch_s_vise_grana}
Ili, na primjer ovako:
\input{git_output/git_branch_s_vise_grana_2}
Svaki redak predstavlja jednu granu, a redak koji počinje sa zvjezdicom (*) je \textbf{grana u kojoj se trenutno nalazimo}.
U toj grani tada možemo raditi sve što i na \verb+master+ -- commitati, gledati njenu povijest, \dots
\section*{Nova grana}
\addcontentsline{toc}{section}{Nova grana}
Ukoliko je trenutni ispis naredbe \verb+git branch+ ovakav:
\input{git_output/git_branch_s_jednom_granom}
\dots{} to znači da je graf našeg projekta ovakav:
\input{graphs/kreiranje_grane_1}
I sad se može desiti da nakon stanja \emph c želimo isprobati dva različita pristupa.
Novu granu možemo stvoriti naredbom \verb+git branch <naziv_grane>+.
Na primjer:
\gitoutputcommand{git branch eksperimentalna-grana}
Sad je novo stanje projekta:
\input{graphs/kreiranje_grane_2}
Sad imamo granu \verb+eksperimentalna-grana+, ali u njoj nemamo još ni jednog čvora (\emph{commit}a).
U toj grani sad možemo raditi točno onako kako smo se do sada naučili raditi s \verb+master+ -- izmijenimo (dodamo, obrišemo) datoteke, spremimo ih u indeks s \verb+git add+ i \emph{commit}amo s \verb+git commit+.
Sad bi dobili da naša nova grana ima svoj prvi čvor:
\input{graphs/kreiranje_grane_2_1}
\section*{Prebacivanje s grane na granu}
\addcontentsline{toc}{section}{Prebacivanje s grane na granu}
Primijetimo da se i dalje "nalazimo" na \verb+master+ grani:
\input{git_output/git_branch_primjer}
Naime, \verb+git branch+ će nam sam stvoriti novu granu.
Prebacivanje s jedne grane na drugu granu se radi s naredbom \verb+git checkout <naziv_grane>+:
\input{git_output/git_checkout}
Analogno, na glavnu granu se vraćamo s \verb+git checkout master+.
Sad, kad smo se prebacili na novu granu, možemo tu uredno \emph{commit}ati svoje izmjene.
Sve što tu radimo, neće biti vidljivo u \verb+master+ grani.
\input{graphs/kreiranje_grane_3}
Kad god želimo, možete se prebaciti na \verb+master+ i tamo nastaviti rad koji nije nužno vezan uz izmjene u drugoj grani:
\input{graphs/kreiranje_grane_4}
Nakon prebacivanja na \verb+master+, izmjene koje smo napravili u \emph{commit}ovima \emph d, \emph e, \emph f i \emph g nam neće biti vidljive.
Kad se prebacimo na \verb+eksperimentalna-grana+ -- neće nam biti vidljive izmjene iz \emph x, \emph y i \emph z.
Ako ste ikad radili grane na nekom drugom, klasičnom, sustavu za verzioniranje koda, onda ste vjerojatno naviknuti da to grananje potraje malo duže (od nekoliko sekundi do nekoliko minuta).
Stvar je u tome što, u većini ostalih sustava, \emph{proces} grananja u stvari podradzumijeva \textbf{kopiranje svih datoteka} na mjesto gdje se čuva nova grana.
To, em traje neko vrijeme, em zauzima više memorije na diskovima.
Kod gita to je puno jednostavnije, kad kreiramo novi granu, nema nikakvog kopiranja na disku.
Čuva se samo informacija da smo kreirali novu granu i \textbf{posebne verzije datoteka koje su specifične za tu granu} (o tome više u posebnom poglavlju).
Svaki put kad spremite izmjenu, čuva se samo ta izmjena.
Zahvaljujući tome postupak grananja je izuzetno brz i zauzima malo mjesta na disku.
\section*{Brisanje grane}
\addcontentsline{toc}{section}{Brisanje grane}
Zato što je grananje memorijski nezahtjevno i brzo, pripremite se na situacije kad ćete se naći s \textbf{previše} grana.
Možda smo neke grane napravili da bi isprobali nešto novo, a to se na kraju pokazalo kao loša ideja pa smo granu napustili.
Ili smo ju započeli da bi riješili neki problem, ali taj problem je prije nas riješio netko drugi.
U tom slučaju, granu možemo obrisati s \verb+git branch -D <naziv_grane>+.
Dakle, ako je stanje grana na našem projektu:
\input{git_output/git_branch_primjer}
\dots{}nakon:
\input{git_output/git_branch_D}
\dots{}novo stanje će biti:
\input{git_output/git_branch_s_jednom_granom}
Primijetimo samo da sad ne možemo obrisati \verb+master+:
\input{git_output/git_branch_D_trenutne_grane}
I to vrijedi općenito -- ne možete obrisati granu na kojoj se trenutno nalazimo.
Treba znati i to da brisanjem grane ne brišemo njene \emph{commit}ove.
Oni ostaju dio povijesti, do daljnjega.
Više detalja o tome koji točno \emph{commit}ovi i u kojim uvijetima se brišu iz povijesti će biti u poglavlju o "higijeni" projekta.
\section*{Preuzimanje datoteke iz druge grane}
\addcontentsline{toc}{section}{Preuzimanje datoteke iz druge grane}
S puno grana, događati će se svakakve situacije.
Relativno česta situacija je kad bismo htjeli preuzeti samo jednu ili više datoteka iz druge grane, ali ne želimo \textbf{preći} na tu drugu granu.
Znamo da su neke datoteke u drugoj grani izmijenjene i želimo ih preuzeti u trenutnu granu.
To se može ovako:
\gitoutputcommand{git checkout <naziv\_grane> -- <datoteka1> <datoteka2> ...}
Na primjer, ako smo u \verb+master+, a treba nam datoteka \verb+.classpath+ koju smo izmijenili u \verb+eksperiment+, onda ćemo ju dobiti s:
\gitoutputcommand{git checkout eksperiment -- .classpath}