diff --git a/create_graphs.py b/create_graphs.py index 564985e..4cbaa12 100644 --- a/create_graphs.py +++ b/create_graphs.py @@ -360,6 +360,92 @@ def graph_ab_simic_2(): return graph +def graph_bez_fast_forward(): + graph = mod_graph.Graph( column = 4 ) + + graph.add_branch( mod_graph.Branch( + label = 'master', + nodes = 'abcdef' ) ) + + graph.add_branch( mod_graph.Branch( + label = 'varijanta', + branch_from = graph.find_node( 'c' ), + row = 1, + nodes = 'xyz' ) ) + + return graph + +def graph_bez_fast_forward_rebase(): + graph = mod_graph.Graph( column = 4 ) + + graph.add_branch( mod_graph.Branch( + label = 'master', + nodes = 'abcdef' ) ) + + graph.add_branch( mod_graph.Branch( + label = 'varijanta', + branch_from = graph.find_node( 'f' ), + row = 1, + nodes = [ 'x\'', 'y\'', 'z\'' ] ) ) + + return graph + +def graph_bez_fast_forward_rebase_2(): + graph = mod_graph.Graph( column = 4 ) + + graph.add_branch( mod_graph.Branch( + label = 'master', + nodes = [ 'a', 'b', 'c', 'd', 'e', 'f', 'x\'', 'y\'', 'z\'' ] ) ) + + return graph + +def graph_fast_forward(): + graph = mod_graph.Graph( column = 4 ) + + graph.add_branch( mod_graph.Branch( + label = 'master', + nodes = 'abc' ) ) + + graph.add_branch( mod_graph.Branch( + label = 'varijanta', + branch_from = graph.find_node( 'c' ), + row = 1, + nodes = 'xyz' ) ) + + return graph + +def graph_fast_forward_2(): + graph = mod_graph.Graph( column = 4 ) + + graph.add_branch( mod_graph.Branch( + label = 'master', + nodes = 'abc---d' ) ) + + graph.add_branch( mod_graph.Branch( + label = 'varijanta', + branch_from = graph.find_node( 'c' ), + row = 1, + nodes = 'xyz' ) ) + + graph.add_arrow( 'z', 'd', color = GRAY ) + + return graph + +def graph_fast_forward_3(): + graph = mod_graph.Graph( column = 4 ) + + graph.add_branch( mod_graph.Branch( + label = 'master', + nodes = 'abcxyz' ) ) + + graph.add_branch( mod_graph.Branch( + label = 'varijanta', + branch_from = graph.find_node( 'c' ), + row = 1, + nodes = 'xyz' ) ) + + return graph + for v in vars().keys(): # create graphs/ director if not exists: try: diff --git a/git-branch.tex b/git-branch.tex index 20d004e..8c233f6 100755 --- a/git-branch.tex +++ b/git-branch.tex @@ -115,11 +115,16 @@ \section*{Brisanje grane} I to vrijedi općenito -- ne možete obrisati granu na kojoj se trenutno nalazite. -%\section*{} -%\addcontentsline{toc}{section}{} +\section*{Preuzimanje datoteke iz druge grane} +\addcontentsline{toc}{section}{Preuzimanje datoteke iz druge grane} -TODO: +S puno grana, dešavati će vam se svakakvi scenariji. +Jedan od relativno čestih je situacija kad biste htjeli preuzeti samo jednu ili više datoteka iz druge grane, ali ne želite \emph{preći} na tu drugu granu. +Samo datoteke. +To se može ovako: -\begin{itemize} - \item preuzimanje samo jednog fajla iz drugog brancha -\end{itemize} +\gitoutputcommand{git checkout -- ...} + +Na primjer, ako ste u \verb+master+, a treba sam datoteka \verb+.classpath+ koju ste izmijenili u \verb+eksperiment+, onda ćete ju dobiti s: + +\gitoutputcommand{git checkout eksperiment -- .classpath} diff --git a/git-merge.tex b/git-merge.tex index bd2eb8a..be8d564 100755 --- a/git-merge.tex +++ b/git-merge.tex @@ -283,9 +283,79 @@ \section*{Merge, branch i povijest projekta} \section*{Fast forward} \addcontentsline{toc}{section}{Fast forward} +Nakon objašnjenja s prethodnih nekoliko stranica, trebalo bi biti jasno što će se desiti ako želimo preuzeti izmjene iz \verb+varijanta+ u \verb+master+ u projektu koji ima ovakvu povijest: + +\input{graphs/bez_fast_forward} + +To je najobičniji \emph{merge} dvije grane. +Razmislimo samo, na trenutak, o jednom očitom detalju; +osnovna pretpostavka i smisao preuzimanja izmjena iz jedne grane u drugu je to što uopće imamo dvije grane. +To su ove dvije crte u gornjem grafu. +Dakle, sve to ima smisla u projektu koji ima nelinearnu povijest (više grana). + +No, postoji jedan poseban slučaj koji zahtijeva malo objašnjenje. +Uzmimo da je povijest projekta bila slična gornjem grafu, ali s jednom malo izmjenom: + +\input{graphs/fast_forward} + +Programer je napravio novu granu \verb+varijanta+ i na njoj je nastavio rad. +I svo to vrijeme nije radio nikakve izmjene na \verb+master+. +Što kad sad želi preizeti sve izmjene u \verb+master+. + +Nije li ovdje nešto neobično? +Iako imamo dvije grane, \emph{smisao} \emph{merge}anja je u tome da neke izmjene iz jedne grane preuzmemo u drugu. +Međutim, iako ovdje imamo dvije grane, \textbf{one čine jednu crtu}. +Te dvije grane imaju jednu povijest. +I to linearnu povijest. + +Tako su razmišljali i originalni autori gita, i zato git danas automatski detektira ovakvu situaciju. +I zato, umjesto standardnog \emph{merge}a, koji bi izgledao ovako: + +\input{graphs/fast_forward_2} + +\dots{}git izvršava takozvani \emph{fast-forward merge}: + +\input{graphs/fast_forward_3} + +Dakle, doslovno kopira cijelu povijest u novu granu (ovdje je to \emph x, \emph y i \emph z). +Čak i ako sad obrišete \verb+varijanta+, cijela njega povijest se nalazi u \verb+master+. + +Git sam odlučuje je li potrebno izvršiti \emph{fast-forward merge} i izvršava ga. Ukoliko to želite izbjeći -- to se radi s: + +\gitoutputcommand{git merge --no-ff varijanta} + \section*{Rebase} \addcontentsline{toc}{section}{Rebase} +Po $n$-ti put, pogledajmo linearni model: + +\input{graphs/linearni_model} + +Do sada bi svima trebalo biti jasno da on ima svoje mane. +No, ima i nešto korisno -- jednostavnost povijesti projekta i privid da je sve skupa teklo po nekom točno određenom rasporedu. +Korak po korak, do trenutne verzije. + +Git vas ne tjera da radite grane, no postupak grananja čini bezbolnim. +U zbog toga povijest projekta \emph{može} postati cirkus kojeg je teško pratiti organizirati. +To zahtijeva malo veću pažnju kad imate puno grana. + +Postoji, ipak, način kako se može od puno grana stvoriti linearna povijest. +Kad bi postojao trik kako da iz ovakvog stanja: + +\input{graphs/bez_fast_forward} + +\dots{}stvorimo ovo: + +\input{graphs/bez_fast_forward_rebase} + +To jest, da \emph{pomaknemo mjesto od kud smo granali} neku granu. +Tada bi \emph{fast-forward} samo kopirao cijelu našu granu u \verb+master+. +Kad bi obrisali \verb+varijanta+, povijest bi odjednom postala linerna: + +\input{graphs/bez_fast_forward_rebase_2} + +Taj trik postoji i zove se \emph{rebase}. + \section*{Cherry-pick} \addcontentsline{toc}{section}{Cherry-pick} diff --git a/submodules/vcgraphtex b/submodules/vcgraphtex index f169e68..806c7a5 160000 --- a/submodules/vcgraphtex +++ b/submodules/vcgraphtex @@ -1 +1 @@ -Subproject commit f169e687926aeefdd952526c9739c12c25e94590 +Subproject commit 806c7a5bc6f29530d138f4e557a06570347c10db