Skip to content

Commit

Permalink
Git merge (ozbiljno) započet
Browse files Browse the repository at this point in the history
  • Loading branch information
tkrajina committed Mar 22, 2012
1 parent de69267 commit 3e132a0
Show file tree
Hide file tree
Showing 6 changed files with 101 additions and 11 deletions.
6 changes: 6 additions & 0 deletions create_git_outputs.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@ def __init__( self, detection_regex, line_rules ):
( '^(\s*\*.*)$', ( BLUE ) ),
]
),
GitOutputSyntaxRule(
detection_regex = '\$\s+git\s+merge.*',
line_rules = [
( '^([^\$].*?)(\+*)(\-*)$', ( BLUE, GREEN, RED ) ),
]
),
GitOutputSyntaxRule(
detection_regex = '\$\s+git\s+log.*',
line_rules = [
Expand Down
34 changes: 34 additions & 0 deletions create_graphs.py
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,40 @@ def graph_kreiranje_grane_4():

return graph

def graph_git_merge_1():
graph = mod_graph.Graph( column = 6 )

graph.add_branch( mod_graph.Branch(
label = 'master',
color = BLUE,
nodes = 'abcxyzq' ) )

graph.add_branch( mod_graph.Branch(
label = 'eksperimentalna-grana',
branch_from = graph.find_node( 'c' ),
row = 1,
nodes = 'defg' ) )

return graph

def graph_git_merge_2():
graph = mod_graph.Graph( column = 6 )

graph.add_branch( mod_graph.Branch(
label = 'master',
color = BLUE,
nodes = 'abcxyzq ' ) )

graph.add_branch( mod_graph.Branch(
label = 'eksperimentalna-grana',
branch_from = graph.find_node( 'c' ),
row = 1,
nodes = 'defg' ) )

graph.add_arrow( 'g', ' ', color = GRAY )

return graph

for v in vars().keys():
# create graphs/ director if not exists:
try:
Expand Down
7 changes: 5 additions & 2 deletions git-branch.tex
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ \chapter*{Grananje}
Ovaj put s jednom izmjenom, svaga "grana" ima svoj naziv.
U uvodnom poglavlju je opisan scenarij koji bi, otprilike, mogao dovesti do ovog grafa.
Ono što je ovdje važno još jednom spomenuti je sljedeće; svaki čvor grafa je nekakvo stanje projekta.
Svaka strelica iz jednog u drugi čvor je neka izmjena koju je programer napravio i snimio u nadi da će ona dovesti do željenog ponašanja aplikacije.
Svaka strelica iz jednog u drugi čvor je izmjena koju je programer napravio i snimio u nadi da će ona dovesti do željenog ponašanja aplikacije.

\section*{Spisak grana projekta}
\addcontentsline{toc}{section}{Spisak grana projekta}
Expand Down Expand Up @@ -77,13 +77,16 @@ \section*{Prebacivanje s grane na granu}

\input{graphs/kreiranje_grane_4}

Kad se prebacite na \verb+master+, izmjene koje ste napravili u \emph{commit}ovima \emph d, \emph e, \emph f i \emph g vam neće biti dostupne.
Istko, kad se prebacite na \verb+eksperimentalna-grana+ -- neće vam biti dostupne 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 je, 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 kreirate novi granu, nema nikakvog kopiranja na disku.
Čuva se samo informacija da ste kreirali novu granu (o tome više u poglavlju o git indeksu).
I svaki put kad spremite izmjenu, čuva se samo ta izmjena.
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}
Expand Down
1 change: 1 addition & 0 deletions git-commit.tex
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@ \section*{Git gui}

Ovdje, kao i u radu s komandnom linijom ne morati sve izmijenjene datoteke snimiti u jednom \emph{commit}u.
Možete dodati nekoliko datoteka, upisati komentar, snimiti i nakon toga dodati sljedećih nekoliko datoteka, opisati novi komentar i snimiti sljedeću izmjenu.
Drugim riječima, izmjene možete snimiti u nekoliko posebnih \emph{commit}ova, tako da svaki od njih čini zasebnu logičku cjelinu.
Koristite li \verb+git gui+ onda ovdje imati još jednu korisnu opciju, možete u međuprostor za commit dodati ne \emph{cijelu} datoteku, nego samo \emph{nekoliko izmijenjenih linija}.
Odaberite datoteku, u polju s izmijenjenim linijama odaberite samo linije koje želite spremite, desni klik i:

Expand Down
56 changes: 47 additions & 9 deletions git-merge.tex
Original file line number Diff line number Diff line change
@@ -1,15 +1,53 @@
\chapter*{Preuzimanje izmjena iz jedne grane u drugu}
\addcontentsline{toc}{chapter}{Preuzimanje izmjena iz jedne grane u drugu}

\begin{itemize}
\item mergeanje znači mergeanje svih izmjena u povijesti, sve od mjesta gdje su se dvije grane bifucirale
\item izuzetak je git cherry-pick (grafovi s obojanim čvorovima)
\item --no-ff --no-commit
\item rebase
\item cherry-pick
\item preuzimanje samo jednog fajla iz drugog brancha
\item kreiranje privremenog brancha za eksperimentalni merge
\end{itemize}
Vratimo se opet na jednu viđenu ilustraciju:

\input{graphs/git_merge_1}

Da ponovoimo, prebacivanjem na granu \verb+master+, izmjene koje ste napravili u \emph{commit}ovima \emph d, \emph e, \emph f i \emph g vam neće biti dostupne.
Istko, kad se prebacite na \verb+eksperimentalna-grana+ -- neće vam biti dostupne izmjene iz \emph x, \emph y i \emph z.

To je sve divno i krasno dok svoje izmjene želite raditi u relativnoj izolaciji od ostatka izmjena u kodu.
No, što ako ste u \verb+master+ riješili neki gadan bug i htjeli biste sad tu ispravku preuzeti u \verb+eksperimentalna-grana+.

Ili, što ako zaključite kako je rezultat eksperimenta kojeg ste isprobali u \verb+eksperimentalna-grana+ uspješan i želite to sad imati u \verb+master+?
Ono što vam sad treba je da nekako \emph{izmjene iz jedne grane preuzmete u drugu granu}.
U gitu, to se naziva \textbf{merge}.
Iako bi merge mogli doslovno prevesti kao "spajanje", to nije ispravna riječ.
Rezultat spajanja bi bila samo jedna grana.
No, \emph{merge}anjem dvije grane -- one nastavljaju svoj život.
Jedino što se sve izmjene koje su do tog trenutka rađene u jednoj granu preuzimaju u drugoj grani.

\section*{Git merge}
\addcontentsline{toc}{section}{Git merge}

Pretpostavimo, na primjer, da sve izmjene iz \verb+eksperimentalna-grana+ želite u \verb+master+.
To se radi s naredbom \verb+git merge+.
Zapamtite, da bi to napravili kako treba, trebate u onoj grani u koju želite preuzeti izmjene (u našem slučaju \verb+master+), i onda:

\input{git_output/git_merge_1}

Ovaj ispis je ukratko opisan rezultat procesa preuzimanja izmjena; koliko je linija dodano, koliko obrisano, koliko je datoteka dodano, koliko oduzeto, i tako dalje\dots

Grafički se \verb+git merge+ može prikazati ovako:

\input{graphs/git_merge_2}

Neka bude jasno -- kad ste preuzeli izmjene iz jednog grafa u drugi, nitko vas ne prisiljava da onaj prvi obrišete.
I dalje možete uredno u njega \emph{commit}ati.

TODO

% \begin{itemize}
% \item mergeanje znači mergeanje svih izmjena u povijesti, sve od mjesta gdje su se dvije grane bifucirale
% \item izuzetak je git cherry-pick (grafovi s obojanim čvorovima)
% \item --no-ff --no-commit
% \item rebase
% \item cherry-pick
% \item preuzimanje samo jednog fajla iz drugog brancha
% \item kreiranje privremenog brancha za eksperimentalni merge
% \end{itemize}

%\section*{}
%\addcontentsline{toc}{section}{}
Expand Down
8 changes: 8 additions & 0 deletions git_output/git_merge_1.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
$ git merge eksperimentalna-grana
Updating 372c561..de69267
Fast-forward
fig1.tex | 23 -----------------------
git-merge.tex | 1 +
uvod.tex | 13 ++++++++-----
3 files changed, 9 insertions(+), 28 deletions(-)
delete mode 100644 fig1.tex

0 comments on commit 3e132a0

Please sign in to comment.