Sustava za upravljanje kodom
Sustav za upravljanje kodom (eng. version control system) ima važno mjesto u razvoju koda. Njegove funkcije su sljedeće:
-
pamti svaku promjenu u svakoj datoteci koja čini softverski projekt i dozvoljava povratak na bilo koju raniju verziju projekta bez gubitaka sadržaja;
-
omogućava kolektivni razvoj koda, izbjegavanje i rješavanje konflikata koji nastaju kada više programera editira istu datoteku;
-
omogućava granjanje projekta radi separiranja izmjena od stabilnog koda. Dozvoljava publiciranje pojedinih verzija koda.
Moderni nekomercijalni sustavi za upravljanje kodom su
Git je danas industrijski standard.
Instalacija Git-a
Instalacija ovisi o operacijskom sustavu:
-
Na Linux sustavu Git je preinstaliran i može se odmah koristiti;
-
Na Windows OS preuzimanje i upute za instalaciju su na stranici https://gitforwindows.org/ ili na stranici https://git-scm.com/download/windows;
-
Na Mac OS treba ići na stranicu https://git-scm.com/download/mac.
Instalacija je uglavnom jednostavna.
Priprema za rad sa Git-om
Sa Git-om ćemo raditi koristeći komandnu liniju, odnosno Git naredbe ćemo zadavati u terminalu. Sve Git naredbe imaju oblik
git naredba [opcije]
Prije samog rada s Git-om potrebno je izvršiti konfiguraciju Git-a koja se sastoji u tome da se postavi korisničko ime i email adresa. U radu s GitHub-om je važno da se postavi email adresa koja je dana GitHub-u prilikom kreiranja računa.
Naredbe koje treba iskoristiti su sljedeće:
git config --global user.name "korisničko_ime"
git config --global user.email "email_adresa"
Repozitorij možemo kreirati na dva načina. Prazan repozitorij kreiramo sa
git init
naredbom ili možemo klonirati već postojeći repozitorij sa
git clone
naredbom.
Kreiranje novog repozitorija
Ako kreiramo posve novi repozitorij prvo trebamo kreirati njegov direktorij i ući u njega.
mkdir Zadatak67
cd Zadatak67
Unutar direktorija sada je dovoljno izvršiti
git init
naredbu. Git će odgovoriti sa Initialized empty Git repository in ...
Ako izlistate direktorij s naredbom
ls -a
vidjet ćete da je Git kreirao skriveni direktorij .git
u kojem drži sve svoje
podatke (repozitorij). Repozitorij je u ovom trenutku prazan i datoteke se
u njega uključuju sa git add
naredbom. Status direktorija se dobiva sa
git status
naredbom.
Git prati datoteke koje su mu dane i pamti svaku njihovu izmjenu koja je predana repozitoriju. Ako su neke izmjene koje su napravljene u repozitoriju dovele do grešaka uvijek je moguće vratiti se na prethodnu verziju repozitorija. Git će zapamtiti čitavu povijest repozitorija.
Git pamti promjene samo onih datoteka koje mu damo sa git add
naredbom. Druge
datoteke u direktoriju ignorira. Recimo da smo u našem direktoriju (Zadatak67)
kreirali datoteki CMakeLists.txt
. Kako bi je Git počeo pratiti moramo
izvršiti naredbu
git add CMakeLists.txt
Uključivanje datoteke u Git repozitorij sastoji se od dva koraka. Pomoću naredbe
git add
datoteka se uključuje u indeks (češći naziv je staging area).
U drugom koraku potrebno je pozvati git commit
naredbu koja sve datoteke iz
indeksa prebacuje u repozitorij i kreira novu trenutnu sliku čitavog radnog
direktorija u repozitoriju. Nakon poziva Naredbe
git commit
Git će otvoriti editor (na linuxu obično vi, no to se može konfigurirati) u koji
trebamo upisati komentar našeg commit-a. Pomoću -m
opcije možemo direktno
dodati komentar.
git commit -m "Dodan je file CMakeLists.txt"
git status, git add, git commit
U direktoriju u kojem razvijamo kod kreiramo Git repozitorij sa git init
naredbom.
Svaku datoteku koju želimo pratiti u repozitoriju dodajemo sa git add
naredbom.
Obično u svakom direktoriju ima i trenutnih i pomoćnih datoteka koje ne želimo
pamtiti u repozitoriju. To se prije svega odnosi na sve datoteke generirane pomoću
prevodioca ili drugih alata; njih nikada ne dodajemo s git add
naredbom.
Ako smo jednu datoteku dodali u indeks sa git add
naredbom i zatim je izmjenili,
nove izmjene nisu registrirane u indeksu sve dok ju ponovo ne dodamo u indeks
sa git add
naredbom.
Kada smo sa grupom izmjena datoteka zadovoljni dodajemo te izmjene u repozitorij
sa git commit
naredbom. Ono što je repozitoriju dodano sa git commit
predstavlja
jednu fazu u razvoju softvera. Svaki spremanje u repozitorij (commit)
dobiva svoj identifikator i predstavlja jednu točku u povijesti razvoja koda na
koju se možemo vratiti.
Osnovni ciklus rada sa repozitorijem je sljedeći:
-
Mijenjamo datoteke u radnom direktoriju;
-
Dodajemo izmjene u indeks (
git add
). Iteriramo 1 → 2 sve dok nismo zadovoljni s izmjenama. -
Ubacujemo izmjene iz indeksa u repozitorij (
git commit
). Vraćamo se na 1 sve dok zadatak nije gotov.
Pomoću git status
naredbe možemo vidjeti koje datoteke nisu u indeksu, koje jesu
ali su u međuvremenu izmijenjene i na osnovu toga znamo koju operaciju treba izvršiti.
Kloniranje postojećeg repozitorija
Projekt često započinjemo kloniranjem već postojećeg Git repozitorija. To će biti slučaj sa zadacima u ovom kolegiju. Zadatak s početnim kodom bit će postavljen kao Git repozitorij na GitHub servisu. Repozitorj treba klonirati na lokalnu mašinu, doraditi kod u repozitoriju prema danim uputama i gurnuti izmjene u GitHub repozitorij.
Kloniranje repozitorija se radi sa git clone
naredbom koja kao opciju uzima URL repozitorija
koji se klonira. Klonirajmo trenutni repozitorij koji je na adresi https://github.com/PMF-MO-OPCPP/Git.
git clone https://github.com/PMF-MO-OPCPP/Git
Git će u direktoriju u kojem smo izvršili ovu naredbu kreirati lokalni direktorij Git
i u njega povući
cijeli sadržaj repozitorija. Ako želimo drukčije ime lokalnog direktorija možemo ga zadati kao
dodatni argument. Naredba
git clone https://github.com/PMF-MO-OPCPP/Git myGit
kreirati lokalni direktorij myGit
i u njega povući cijeli sadržaj repozitorija.
Rad sa repozitorijem je posve isti kao i kada repozitorij kreiramo lokalno sa git init
naredbom. Modificiramo datoteke, koristimo git add
naredbu za prijavljivanje izmjena
u indeks i git commit
naredbu za ubacivanje izmjena iz indeksa u lokalni repozitorij.
Kad je jedan dio zadatka (projekta) gotov potrebno je lokalni repozitorij gurnuti na GitHub, odnosno u udaljeni repozitorij koji smo klonirali (koji može biti bilo gdje, na lokalnom serveru ili nekom drugom stroju). Naravno, za tu operaciju je potrebno imati odgovarajuće ovlasti.
Prilikom kloniranja git kreira simboličko ime origin
koje referira na udaljeni repozitorij
koji smo klonirali (tako da ne moramo pamtiti njegov URL).
Za prebacivanje modifikacija lokalnog repozitorija na udaljeni repozitorij koristimo naredbu
git push origin master
Time na origin
(https://github.com/PMF-MO-OPCPP/Git
) prebacujemo modificiranu master
granu
repozitorija. Grana master
je automatski kreirana grana u kojoj se nalazi cijeli kod.
Kako u našim primjerima nećemo kreirati nove grane sav će kod uvijek biti u master
grani.
Analogna naredba postoji za povlačenje izmjena u udaljenom repozitoriju na lokalni repozitorij:
git pull origin master
Naredba
git remote -v
otkriva puni URL origin
repozitorija.
Ukoliko nismo mijenjal granu repoziorija (naredba git checkout
) nalazimo se na master
grani.
To je glavna grana repozitorija koja se kreira automatski i dobiva ime master
. Prilikom razvoja softvera,
ispravljanja grešaka ili dodavanja nove funkcionalnosti, novi kod se obično razvija u novoj grani
dok master
grana ostaje netaknuta sve dok izmjene u novoj grani nisu potpune. Tada se te izmjene
uključuju u master
granu (to je proces koji se naziva merge
). Mi grane nećemo koristiti
tako da će jedina grana uvijek biti master
.
Napomena: git pull
naredba povlači izmjene s udaljenog repozitorija lokalno i vrši uključivanje
izmjena u lokalni repozitorij. U tom koraku može doći do konflikta između lokalnih izmjena
i izmjena u udaljenom repozitoriju koje se moraju rješavati ručno.
Submodul
Za testiranje koda koristit ćemo Google Test biblioteku (googletest) otvorenog koda koja se nalazi na GitHub-u na adresi
https://github.com/google/googletest
. Biblioteku bismo mogli instalirati na lokalnom računalu i naše programe
povezati s njom za vrijeme izgradnje programa. Mi ćemo iskoristiti drugi pristup koji je moguć stoga
što googletest ima javno dostupan Git repozitorij, a sastoji se u tome da gtest učitamo u naš Git projekt kao submodule.
Submodule je Git repozitorij koji se nalazi u jednom direktoriju unutar nekog drugog Git repozitorija.
Submodul se kreira pozivom naredbe git submodule add
koja uzima URL repozitorija koji želimo preuzeti
kao submodule. U našim zadacima ćemo u repozitoriju imati direktorij external
. Ako u tom direktoriju
izvršimo naredbu
git submodule add https://github.com/google/googletest
dobit ćemo poddirektorij external/googletest
u koji će biti utočena googletest biblioteka. Pored toga
bit će kreirana skrivena datoteka .gitmodules
sljedećeg sadržaja:
[submodule "ex5/external/googletest"]
path = ex5/external/googletest
url = https://github.com/google/googletest
(čitav projekt je u direktoriju ex5
). Git će automatski dodati .gitmodules
i external/googletest
direktorij u
indeks te nam preostaje samo sa git commit
ubaciti ih u lokalni repozitorij.
Kada gurnemo lokalni repozitorij sa submodulom u udaljeni repozitorij sam submodul neće biti kopiran već
će biti kopiran samo prazan direktorij submodula (ovdje /external/googletest
) i datoteka .gitmodules
.
Isto se dešava kada kloniramo repozitorij sa submodulom.
Ako smo klonirali repozitorij sa submodulom (što će biti naš slučaj sa zadacima) onda prije rada na repozitoriju i kompilacije treba pozvati sljedeće dvije naredbe:
git submodule init
git submodule update
Prva naredba vrši lokalnu inicijalizaciju submodula, a druga dohvaća submodul iz njegovog udaljenog repozitorija i smješta ga njegov direktorij. Nakon toga se može početi raditi na projektu (zadatku).
GitHub
GitHub je platforma za razvoj softvera bazirana na Git sustavu za upravljanje kodom. Kod koji se razvija pod Git-sustavom nalazi se u repozitoriju koji je koncipiran tako da više programera može istovremenio raditi na njemu. GitHub nudi besplatne javne repozitorije koje možemo koristiti za razvoj i dijeljenje vlastitog koda. Repozitoriji su javni u smislu da ih svatko može vidjeti i klonirati te raditi na svojoj lokalnoj kopiji koda, ali ne može modificirati GitHub repozitorij ukoliko mu vlasnik ne da dopuštenje za to. GitHub nudi i privatne repozitorije koji nisu javno dostupni, ali oni nisu besplatni.
Otvaranje GitHub računa
Za rad na kolegiju OOP(C++) svaki student mora otvoriti vlastiti GitHub račun ukoliko ga još nema. Račun se otvara na stranici https://github.com/. Prilikom otvaranja računa koristimo opciju Sign up; kada imamo račun prijavljujemo se u sustav kroz Sign in.
Za otvaranje računa potrebno je odabrati korisničko ime i lozinku te dati svoju email adressu. Molim da koristite onu adresu koju redovito koristite. Na sljedećoj stranici zadržite selektiranim Unlimited public repositories for free te kliknite Continue. Na trećoj stranici selektirajte odgovore po svom izboru i kliknite Continue. Ostaje još samo potvrditi danu email adresu tako što ćete u emailu koji će vam poslati Github kliknuti na link Verify email address. Time ste gotovi. U sljedećem koraku možete kliknuti na Read the guide i upoznati se sa Github-om i radom s repositorijima. U ovom trenutku ne morate kreirati nikakav projekt već se možete odjaviti (ikona gore desno).
GitHub Classroom
Za distribuciju zadataka na ovom kolegiju koristimo GitHub Classroom servis. Classroom funkcionira
tako što nastavnik putem email poruke šalje studentima URL repozitorija koji trebaju klonirati.
Studenti trebaju slijediti dobiveni URL pri čemu Classroom za njih kreira privatni repozitorij
sa zadatkom. Na tom privatnom repozitoriju student ima pravo koristiti pull
i push
naredbe (koristeći
svoj login i password).
Važna napomena. Pri rješavanju zadataka potrebno je git push
naredbu izvršiti barem dva puta: u sredini
procesa rješavanja i na kraju kada je zadatak riješen. Veći broj push
-ova u udaljeni repozitorij
je dobrodošao. Ovo je nužno kako bi se spriječilo da se tuđe rješenje jednostavno gurne u GitHub
repozitorij. Zadaci koji su spremljeni sa samo jednom git push
naredbom se neće uzimati u obzir.
Resursi
Na internetu postoje brojni resursi za učenje Git-a. Na primjer, za početnike postoji više tutorijala na YouTube-u, kao što je ovaj: Git Tutorial.
Glavni izvor informacija o Git-u je knjiga Pro Git. Za rad sa Git-om studenti se trebaju upoznati sa sadržajem drugog poglavlja knjige. Nakon što ste se upoznali s osnovama Git-a dodatne informacije o radu s GitHub-om se nalaze u poglavlju šest. Dovoljno je pogledati prve tri sekcije.