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:

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:

  1. Mijenjamo datoteke u radnom direktoriju;

  2. Dodajemo izmjene u indeks (git add). Iteriramo 1 → 2 sve dok nismo zadovoljni s izmjenama.

  3. 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.