Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
tkrajina committed Apr 11, 2013
2 parents 1248445 + 5c6bc50 commit 5723e85
Show file tree
Hide file tree
Showing 18 changed files with 194 additions and 182 deletions.
6 changes: 3 additions & 3 deletions cesta-pitanja.tex
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,11 @@
Na primjer, slučajno smo commitali u \verb+master+, a trebali smo u \verb+unicode-fix+.
Pretpostavimo da su zadnja dva $commit$a iz \verb+master+ ona koja želimo prebaciti u ovu drugu granu.

Riješenje je jednostavno, prvo ćemo se prebaciti u tu drugu granu:
Rješenje je jednostavno, prvo ćemo se prebaciti u tu drugu granu:

\gitoutput{git checkout unicode-fix}

Zatim chemo preuzeti jedan po jedan ta dva $commit$a u trenutnu granu:
Zatim ćemo preuzeti jedan po jedan ta dva $commit$a u trenutnu granu:

\gitoutput{git cherry-pick master\textasciitilde{}1\\
git cherry-pick master}
Expand Down Expand Up @@ -101,7 +101,7 @@

\tocSection{Zadnjih $n$ $commit$ova treba "stisnuti" u jedan $commit$}

S \verb+git log+ ili \verb+gitk+ nađite SHA1 identifikator zadnjeg $commit$a kojeg \textbf{želimo ostaviti netaknutog} (tj. sve $commitove$ \textbf{nakon} njega želimo "stisnuti" u jedan $commit$).
S \verb+git log+ ili \verb+gitk+ nađimo SHA1 identifikator zadnjeg $commit$a kojeg \textbf{želimo ostaviti netaknutog} (tj. sve $commitove$ \textbf{nakon} njega želimo "stisnuti" u jedan $commit$).
Neka je to, na primjer, \verb+15694d32935f07cc66dbc98fdd7b3b248d885492+.

Treba pripaziti se da lokalno u repozitoriju nemamo nikakvih ne$commit$anih izmjena i da se nalazimo u pravoj grani, a onda:
Expand Down
74 changes: 37 additions & 37 deletions git-branch.tex
Original file line number Diff line number Diff line change
@@ -1,50 +1,50 @@
\chapter*{Grananje}
\addcontentsline{toc}{chapter}{Grananje}

Još jednom ćemo početi s već viđenim grafom:
Još ćemo jednom početi s 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.
U uvodnom je poglavlju 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 je čvor grafa stanje projekta u nekom trenutku njegove povijesti.
Svaka strelica iz jednog u drugi čvor izmjena je 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:
Želimo li vidjeti koje točno grane našeg projekta trenutno postoje naredba je \verb+git branch+.
U većini će slučajeva rezultat te naredbe 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:
Ako 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:
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}.
Svaki redak predstavlja jednu granu, a redak koji počinje zvjezdicom (*) \textbf{grana je 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:
Ako 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.
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:

Expand All @@ -54,9 +54,9 @@ \section*{Nova grana}

\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:
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+: mijenjati (dodavati, brisati) datoteke, spremati ih u indeks s \verb+git add+ i \emph{commit}aati s \verb+git commit+.
Sad bismo dobili da naša nova grana ima svoj prvi čvor:

\input{graphs/kreiranje_grane_2_1}

Expand All @@ -67,51 +67,51 @@ \section*{Prebacivanje s grane na granu}

\input{git_output/git_branch_primjer}

Naime, \verb+git branch+ će nam samo stvoriti novu granu.
Prebacivanje s jedne grane na drugu granu se radi s naredbom \verb+git checkout <naziv_grane>+:
Naime, \verb+git branch+ stvorit će nam samo novu granu.
Prebacivanje s jedne grane na drugu granu radi se naredbom \verb+git checkout <naziv_grane>+:

\input{git_output/git_checkout}

Analogno, na glavnu granu se vraćamo s \verb+git checkout master+.
Analogno, na glavnu se granu 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.
Sada 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:
Kad god želimo, možemo 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.
Nakon prebacivanja na \verb+master+, izmjene koje smo napravili u \emph{commit}ovima \emph d, \emph e, \emph f i \emph g neće nam 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.
Stvar je u tome što u većini ostalih sustava \emph{proces} grananja u stvari podrazumijeva \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.
Kod gita je to puno jednostavnije. Nakon što kreiramo novu 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.
Svaki put kad spremite izmjenu čuva se samo ta izmjena.
Zahvaljujući tome postupak grananja je izuzetno brz i zauzima malo mjesta na disku.

\subsection*{Prebacivanje na granu i tekuće izmjene}
\addcontentsline{toc}{subsection}{Prebacivanje na granu i tekuće izmjene}

Kod prebacivanja s grane na granu s \verb+git checkout+ može nastati manji problem ukoliko imamo ne\emph{commit}anih izmjena.
Kod prebacivanja s grane na granu s \verb+git checkout+ može nastati manji problem ako imamo ne\emph{commit}anih izmjena.
Postoji nekoliko situacija u kojima nam git neće dopustiti prebacivanje.
Najčešća je kad u dvije grane imamo dvije različite verzije iste datoteke, a tu datoteku ste u tekućoj grani izmijenili ostavili ne\emph{commit}anu.
Najčešća je kada u dvije grane imamo dvije različite verzije iste datoteke, a tu smo datoteku u tekućoj grani izmijenili, ostavili ne\emph{commit}anu.

Zapamtite, \textbf{najbolje je prebacivati se s grane na granu tek nakon smo \emph{commit}ali sve izmjene}. Tako će nas u novoj grani dočekati čista situacija, a ne datoteke koje smo izmijenili dok smo radili na prethodnoj grani.
Zapamtite, \textbf{najbolje je prebacivati se s grane na granu tek nakon što smo \emph{commit}ali sve izmjene}. Tako će nas u novoj grani dočekati čista situacija, a ne datoteke koje smo izmijenili dok smo radili na prethodnoj grani.

\section*{Brisanje grane}
\addcontentsline{toc}{section}{Brisanje grane}

Zato što je grananje memorijski i procesorski 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.
Možda smo neke grane napravili da bismo isprobali nešto novo, a to se na kraju pokazalo kao loša ideja pa smo granu napustili.
Ili smo je započeli da bismo 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>+.
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}
Expand All @@ -128,23 +128,23 @@ \section*{Brisanje grane}

\input{git_output/git_branch_D_trenutne_grane}

I to vrijedi općenito -- ne možemo obrisati granu na kojoj se trenutno nalazimo.
To vrijedi i općenito, ne možemo obrisati granu na kojoj se trenutnačno 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.
Oni ostaju dio povijesti do daljnjega.
Više detalja o tome koji točno \emph{commit}ovi i u kojim se uvijetima 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.
Relativno česta situacija je da želimo 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:
Na primjer, ako smo u \verb+master+, a treba nam datoteka \verb+.classpath+ koju smo izmijenili u \verb+eksperiment+, onda ćemo je dobiti s:

\gitoutputcommand{git checkout eksperiment -- .classpath}

20 changes: 10 additions & 10 deletions git-commit.tex
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ \subsection*{O indeksu i stanju datoteka}

\input{git_output/git_status_nakon_indeksa}

Izmijenimo li tu datoteku direktno u projektu -- novo stanje će biti ovakvo:
Izmijenimo li sad tu datoteku još jednom, novo stanje će biti ovakvo:

\input{git_output/git_status_nakon_indeksa_2}

Expand Down Expand Up @@ -273,31 +273,31 @@ \section*{Git gui}

\gitgraphics{images/git-gui.png}{12cm}

Program se sastoji od četiri polja.
Program se sastoji od četiri pravokutna polja:

\begin{itemize}
\item Polje za datoteke koje su izmijenjene, ali nisu još u indeksu (gore lijevo).
\item Polje za prikaz izmjena u pojedinim datotekama (gore desno).
\item Polje za datoteke koje su izmijenjene i stavljene su u indeks (dolje lijevo).
\item Polje za \emph{commit} (dolje lijevo).
\item Polje za datoteke koje su izmijenjene, ali nisu još u indeksu (označeno s \textcolor{orange}{\textbf{A}}).
\item Polje za prikaz izmjena u pojedinim datotekama (\textcolor{orange}{\textbf{B}}).
\item Polje za datoteke koje su izmijenjene i stavljene su u indeks (\textcolor{orange}{\textbf{C}}).
\item Polje za \emph{commit} (\textcolor{orange}{\textbf{D}}).
\end{itemize}

Klik na neku datoteku će prikazati sve izmjene koja ta datoteka sadrži u odnosu na zadnje snimljeno stanje u repozitoriju.
Format je isti kao i kod \verb+git diff+.
Klik na ikonu uz naziv datoteke će istu prebaciti iz polja izmijenjenih datotka u polje s indeksom i suprotno.
Nakon što odaberemo datoteke za koje želimo da budu dio našeg \emph{commit}a, trebamo unijeti komentar i kliknuti na "Commit" za snimanje izmjene.
Nakon što odaberemo datoteke za koje želimo da budu dio našeg \emph{commit}a\footnote{To jest, nakon što te datoteke spremimo u $index$ iliti nakon što ih prebacimo iz gornjeg lijevog polja u donje lijevo polje.}, trebamo unijeti komentar i kliknuti na "Commit" za snimanje izmjene.

Ovdje, kao i u radu s komandnom linijom ne moramo sve izmijenjene datoteke snimiti u jednom \emph{commit}u.
Možemo dodati nekoliko datoteka, upisati komentar, snimiti i nakon toga dodati sljedećih nekoliko datoteka, opisati novi komentar i snimiti sljedeću izmjenu.
Možemo prebaciti u indeks samo dio 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žemo snimiti u nekoliko posebnih \emph{commit}ova, tako da svaki od njih čini zasebnu logičku cjelinu.

S \verb+git gui+ imamo još jednu korisnu opciju -- možemo u indeks dodati \textbf{ne cijelu datoteku, nego samo nekoliko izmijenjenih linija} datoteke.
Za tu datoteku, u polju s izmijenjenim linijama odaberimo samo linije koje želimo spremite, desni klik i:
Za tu datoteku, u polju s izmijenjenim linijama odaberimo samo linije koje želimo spremiti, desni klik i odaberite "\verb+Stage lines to commit+":

\gitgraphics{images/git-gui-stage-lines-to-commit.png}{12cm}

Ako smo na nekoj datoteci napravili izmjenu koju \emph{ne} želimo snimiti -- takvu datoteku možemo resetirati, odnosno vratiti u početno stanje.
Jednostavno odaberemo ju u meniju \verb+Commit+ $\rightarrow$ \verb+Revert changes+.
Jednostavno odaberemo tu datoteku i u meniju kliknemo na \verb+Commit+ $\rightarrow$ \verb+Revert changes+.

Osim ovoga, \verb+git gui+ ima puno korisnih mogućnosti koje nisu predmet ovog poglavlja.
Preporučam vam da nađete vremena i proučite sve menije i kratice s tastaturom u radu, jer to će vam značajno ubrzati daljnji rad.
Expand Down
Loading

0 comments on commit 5723e85

Please sign in to comment.