Git Merge - Git Rebase

Iako je git merge najlakši i najčešći način za integraciju grana(branch) nije jedini. Postoji još jedna komanda a to je git rebase.

Git merge

Kada se pokrene komanda git merge, ona traži tri commit-a.

Prvi je zajednički predak. Ako u toku nekog projekta pratite istoriju dve grane, one uvek imaju najmanje jednog zajedničkog pretka(common ancestor). U tom trenutku, obe grane su imale isti sadržaj a zatim su se razvile različito.

Druga dva commit-a su zadnji commit-i svake grane. Krajnji cilj integracije je kombinacija trenutnih stanja dve grane. Zato su njihovi poslednji commit-i( zadnji commit na grani A i zadnji commit na grani B ) od posebnog interesa. Kombinacija ova tri commit-a nam omogućuje da ostvarimo željeni rezultat.

U većini slučajeva svaka grana se razvija sama za sebe kao što je prikazano na slici iznad. Da bi se sprovela integracija, git mora da kreira novi commit koji sadrži razliku između njih – takozvani merge commit.

Tu se sada javlja jedna interesantna stvar. Commit-e prave sami programeri. U njima su objašnjene i komentarisane same promene koje se prave. Merge commit je malo drugačiji. Njega kreira sam git a ne programer. I umesto da objasni nastale promene njegova namena je da poveže dve grane. Ako želite da shvatite operaciju spajanja morate da pogledate istoriju obe grane.

Git rebase

Neki programeri radije koriste spajanje grana bez tih merge commit-a. Evo primera. Pretpostavimo da hoćemo da spojimo grane kao sa slike ispod. Hoćemo da integrišemo promene sa grane B u granu A.

Prvo, git će „poništiti“ sve commit-e sa grane A nastale nakon razdvajanja grana. Naravno, neće izbrisati commit-e iz memorije, već će ih samo privremeno zapamtiti u svojoj memoriji.

Zatim, git prihvata sve commit-e grane B koje hoćemo da integrišemo. U ovom trenutku obe grane izgledaju istovetno.

U završnom koraku, commit-i grane A se opet primenjuju, ali na novoj poziciji, iza commit-a grane B.

Naravno, i git rebase ima svoje mane i ograničenja. Najbitnija stavka je da rebase prepisuje istoriju promena. Na poslednjoj slici commit C3* ima i zvezdicu. To je zato što iako ima isti sadržaj kao i commit C3, to nije isti commit. Razlog je što ovaj commit ima novog neposrednog pretka C4 u poređenju sa pretkom C1 kada je ovaj commit i kreiran.

Svaki commit sadrži mnogo informacija poput autora, datuma, opisa promena i ko je njen roditelj (predak). Promenim bilo koje od ovih informacija stvara se potpuno novi commit, sa novim ID-em.

Prepisivanje istorije promena na ovaj način nije problematičan sam po sebi, dokle god commit-i nisu javno objavljeni. Ukoliko prepisujete istoriju commit-a koji su već objavljeni na serveru dolazi do opasnosti da drugi programer koji radi na tom projektu sigurno temelji svoj rad na prvobitnim commit-ima. Stoga bi rebase trebalo da se koristi samo za sređivanje vašeg lokalnog projekta, ali nikako da se vrši rebase (spajanje) projekta koji je već objavljen na javnom serveru.

Napisao Rade Mrkić

Share :