KRATKI PODSJETNIK ZA KORIŠTENJE GITA

Očekuje se da su pogledani svi tutoriali na ovoj poveznici!

Podsjetnik je napisan za potrebe članova grupe na opp-u.

1) Inicijalizacija radnog direktorija

Potrebno je pozicionirati se u direktorij u kojem želimo stvoriti direktorij projekta. U tom direktoriju potrebno je izvršiti naredbu:

git clone https://github.com/domagojb/Vrtic

Ova naredba stvara direktorij s nazivom projekta, odnosno repozitorija i u njega kopira sve datoteke i direktorije iz repozitorija koji se trenutno nalaze u projektu. 

2) Rad na projektu

Prije svakodnevnog (ili kad god) rada na projektu potrebno je napraviti sljedeće.

  1. Izvršiti git pull. Ovom naredbom automatski skidate najnoviju verziju projekta. Ako nemate najnoviju verziju nečete moći dodati svoje izmjene u repozitorij na webu.

Kada napravite neku izmjenu, potrebno je napraviti add, commit i push u repozitorij.

git add <ime datoteke ili datoteka koje su izmjenjene>

git commit -m "<poruka>"

git push 

Ovim trima naredbama osvježujete repozitorij sa svojim izmjenama. Dobro je nakon svake idejne izmjene napraviti prethodno. Npr. napravljena je nova funkcija koja je istestirana koju netko može dalje koristiti. Čim se češće pusha, time je lakše vratiti se natrag nakon pogreške s minimalnim gubicima.

Poruke pri commit naredbi neka budu kratke i jasne te esencijalno definiraju promjenu. Npr. napisali ste funkciju izracunaj() u math.c napisali bi git commit -m "U math.c dodao funkciju izracunaj"

Dobro je prije adda i prije commita provjeriti koje izmjene će se primijeniti sa git status. Ova naredba će napisati što se prati, što je izmijenjeno i što je spremno za commit. Ovo bi vam trebalo biti poznato iz videa.

3) Mogući konflikti prilikom git push

Ako želite pushati svoje izmjene na repozitorij morate imati najnoviju verziju. Ako je netko tijekom vašeg rada napravio push, morat ćete ponovo prije svojeg pusha izvršiti git pull. Nakon toga možete pushati. Moguće čete morati ponoviti cijeli postupak od add. 

Mogući konflikt će se desiti ako netko u isto vrijeme napravi izmjenu na istoj datoteci koju vi mijenjate. Ako probate pushati izmjenu javit će vam konflikt. Morate napraviti git pull. Git će u datoteci ili datotekama u kojima su nastali konflikti označiti izmjene koje ste napravili vi, a koje je napravio netko usporedno s vama, ali je prije vas pushao. Na vama je da nakon što dobijete poruku o konfliktu da provjerite sve izmjene i odredite što ostaje. Potrebno je ponovo sve što je bilu u konfliktu addati, commitati i pushati. Nakon toga će biti poslane izmjene na repozitorij.

Primjer izgleda datoteke sa konfliktom. Scenarij je sljedeći. Dva programera imaju najnoviju verziju iz repozitorija koju su dobili sa git pull. Npr. da je Programer 1 pullao u 9:43, a Programer 2 u 9:49. Obojica kreću u izmjenu datoteke main.c. Programer 1 je dodao funkciju ispis() te ju commitao i pushao na repozitorij u 10:02. Programer 2 dodao je funkciju upis() te ju želi commitati i pushati u 10:03.

Programer 2 će dobiti sljedeću pogrešku:

! [rejected]        master -> master (fetch first)

error: failed to push some refs to 'https://github.com/domagojb/Book.git'

hint: Updates were rejected because the remote contains work that you do

hint: not have locally. This is usually caused by another repository pushing

hint: to the same ref. You may want to first integrate the remote changes

hint: (e.g., 'git pull ...') before pushing again.

hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Esencijalno, git želi reći da nemamo najnoviju verziju. Git nam sugerira da napravimo git pull. Nakon izvršenja git pull:

Auto-merging main.c
CONFLICT (content): Merge conflict in main.c
Automatic merge failed; fix conflicts and then commit the result.

Git nam kaže da popravimo konflikte. Ako otvorite main.c ponovo on izgleda ovako.

<<<<<<< HEAD
void upis() {
    scanf();
}
=======
int ispis() {
    printf("Ispisujem");
>>>>>>> 79b5dd21992287f186ca77875c154d4922e650f9
}
int main() {
    return 0;
}

HEAD, commit SHA ključ i strelice označuju tko je napravio koje izmjene. Tuđe i vaše izmjene su odvojene sa ====. Na vama je da sada prepravite main.c  i ponovo napravite add, commit, push. U ovom slučaju željeli bi ste ostaviti obje funkcije pa čete izbrisati ovo što vam je dodao git i ostaviti ono bitno.

void upis() {
    scanf();
}
int ispis() {
    printf("Ispisujem");
}
int main() {
    return 0;
}

Sada će sve izmjene biti na repozitoriju. 


Za sve nejasnoće, greške, dodatke mi javite na mejl domagoj.boros@fer.hr.