GIT & GitLab Flashcards
System Subversion (SVN)
Koristi centralni server na kojem ce se nalaziti sav izvorni
kod, pamte se trenutne verzije projekata i svi diff-ovi na osnovu kojih mozemo da vidimo kako je
projekat u nekom trenutku izgledao. Problem je sto konstantna konekcija sa serverom nije
moguca zbog interneta tj. ne mozemo nista offline da radimo.
GIT - Sistem za pracenje verzija
Treba da bude distribuiran. Svi programeri u lokalu
imaju kompletnu istoriju celog projekta. Svaki programer ima svoj racunar na kom ima svoj
projekat + ceo repozitorijum gde se nalazi cela istorija tog projekta. Drugi programer isto. Time
je omoguceno da svako kod sebe lokalno moze da pravi izmene na projektu, bez konekcije sa
serverom. Pored toga, postoji udaljeni server koji je glavni, kojem se sve izmene salju I odakle se
sve izmene preuzimaju. Na taj nacin, komunikacija se vrsi samo izmedju servera I konkretnog
programera (a ne izmedju programera medjusobno)
git diff
git diff – izmene od poslednjeg commita. Napomena: ovo se odnosi na izmene koje su u working
area, kada se jednom doda fajl u staging area komandom git add ne prikazuje se vise uopste
preko diff
git diff id_commita – prikazuje razlike od zadatog komita do trenutne verzije (SVE izmene, bez
obzira da li su u working ili staging area). Ne mora ceo id_commita da se pise, dovoljno je prvih
nekoliko (6) cifara, ostale ce git dopuniti sam. U slucaju da ima vise komitova cije su to pocetne
cifre, bira se skoriji
git diff HEAD – diff od poslednjeg commita
git log
git log –oneline - izlistavaju se komitovi, svaki u zasebnoj liniji (id, zaglavlje)
git log –oneline –all –decorate –graph – za lepsi prikaz istorije logova + stablo grana
git log –putanja_do_fajla_koji_nas_zanima – izlistava samo commitove koji su vezani za taj fajl
Razlika izmedju tagova I grana
Grana sluzi da nastavimo sa razvojem odvojeno od glavne verzije programa, a tagovi samo da
damo ime konkretnom komitu I da taj tag uvek pokazuje na taj konkretan komit
Razlika izmedju git fetch i git pull
git fetch – povlaci sve izmene ali ne primenjuje
git pull = git fetch + git merge
git merge ime_grane_koju_ubacujemo_u_nasu_trenutnu – sve komitove iz grane koju
navodimo prenosi u novonastalu granu koju spaja sa onom u kojoj smo trenutnu
Razlika izmedju git merge I git rebase
Merge pravi 1 commit (od 2 koja spaja) I istorija osta ista nadalje. Graf je haotican
Rebase sve izmene se primenjuju na master (aktuelnu verziju). Dodajemo nove komitove I novu
istoriju (sve komitove koji su se desili na master grani posle pravljenja te grane
hocu da prebaci na vrh te nove grane) . Graf je linearan
git stash
Ponistava izmene ali ostavlja ih za slucaj da nam mozda kasnije zatrebaju
(poslednja se vraca sa git stash pop, a moze I: git stash pop stash@{1}, a izlistavamo sa
git stash list)
git revert
Ako zelimo da ponistimo neke izmene tj. da neki komit napravimo inverznim
git cherry-pick
Kada zelimo samo 1 commit da prebacimo I na druge grane (korisno kada npr.
imamo isti bag na vise grana, a popravimo ga na jednoj, hocemo da bude popravljen na svakoj)
U toj kopiramo sha kod komita u kom je popravljen bag, prebacimo se na tu drugu granu na kojoj
je bag popravljen I onda uradimo: git cherry-pick sha_kod. To ce da prenese na novu granu isti
taj komit (isti sadrzaj tog komita, ali novi jedinstveni id)
git commit –amend
Modifikovanje poslednjeg komita (zapravo pravi novi komit, a uklanja
stari, taj stari ne pripada vise nijednog grani)
Opciju –amend treba da koristimo samo za komitove koji nisu deljeni sa ostalim članovima tima. Problem je u tome što vrši izmene nad git grafom, jer ova opcija zapravo obriše stari komit i zameni ga novim
Bisekcija GIT
Sluzi kada imamo problem na nekom komitu konkretno a znamo da se u nekom ranijem komitu taj problem nije javljao (npr. bag). Ideja jeste da pretrazimo istoriju commit-ova pomocu algoritma bisekcije drveta:
- git bisect start – zapocinje algoritam binarne pretrage
- git bisect good id_commita – time kazemo da bag nije postojao u tom komitu
- git bisect bad master – u ovom komitu (master) postoji bag
- Pomocu algoritma dobijamo komitove i broj koraka koji jos treba da se uradi do utvrdjivanja u kom komitu je problem nastao. Kada dobijemo id_commita treba da proverimo da li taj bag postoji u tom commit-u i ukoliko postoji treba da uradimo git bisect bad u suprotnom treba uraditi git bisect good dok ne ostane 0 koraka koji treba da se urade jos.
- git bisect reset
git worktree
Kao da pravi ceo klon repozitorijuma na nekoj drugoj lokaciji (npr. git worktree
add ime_direktorijuma ime_nove_grane – time smo se pozicionirali u dati direktorijum na bas tu
datu granu). Razlika izmedju ovoga I git clone je sto git worktree ne zauzima duplo mesta (deli se
.git direktorijum)
Ukljucivanje drugih projekata u nas projekat
Postoje 2 mogucnosti da kopiramo ceo direktorijum neke verzije nekog fajla ili da to uradimo putem git submodule add url_do_repozitorijuma.
Kada kloniramo neke repozitorijume koji imaju podmodule,
moramo rucno da kloniramo I njih git submodule update –init , a ako ti submoduli imaju svoje submodule, onda dodajemo opciju –recursive na kraj ove komande
Sta sve treba da sadrzi description u okviru Merge Requesta?
- sta je promenjeno
- razlog zasto je promenjeno
- nacin na koji je nesto uradjeno
- objasniti alternativne pristupe I zasto je nas odabrani pristup bolji od njih
- ukoliko ta nasa izmena popravlja neki bag, obavezno staviti link do njega ( npr. Fixes
!42 a npr. Fixes: #1 daje referencu ka zadatku pod rednim brojem 1) - Assignee – ko treba da uradi taj zadatak
- Reviewer – jedna ili vise ljudi od kojih trazimo da pogleda nas kod (oni imaju opciju
Approve da odobre nas kod ukoliko je sve dobro) - Milestone – do kada ovaj zadatak treba da bude uradjen
- Labels – kao tag da nas lakse odvede do nekog manjeg dela
- Merge options:
▪ Delete source branch when merge request is accepted. (automatski brise
granu koju smo napravili zbog tog merge request-a)
▪ Squash commits when merge request is accepted. (sve komitove koje
smo napravili ce pretvoriti u 1 I to ce se na master grani prikazati kao 1
komit umesto cela istorija komitova, preporuka: ne )