From 2188b5f873b1f9cc6ab9fc75a520c61f6a81acea Mon Sep 17 00:00:00 2001 From: Andrei Date: Wed, 25 Mar 2026 15:25:04 +0200 Subject: [PATCH] Implementare finala --- README.md | 271 ++++++++++++++++++++++++++++++++++++- images/branches-rebase.png | Bin 0 -> 3800 bytes images/branches.png | Bin 0 -> 3406 bytes images/conflict.png | Bin 0 -> 15926 bytes images/file_branch_1.png | Bin 0 -> 10357 bytes images/file_branch_2.png | Bin 0 -> 10256 bytes practice/.gitignore | 3 + practice/Makefile | 8 ++ practice/main.cc | 90 ++++++++++++ 9 files changed, 371 insertions(+), 1 deletion(-) create mode 100644 images/branches-rebase.png create mode 100644 images/branches.png create mode 100644 images/conflict.png create mode 100644 images/file_branch_1.png create mode 100644 images/file_branch_2.png create mode 100644 practice/.gitignore create mode 100644 practice/Makefile create mode 100644 practice/main.cc diff --git a/README.md b/README.md index b54817d..d33dd5a 100644 --- a/README.md +++ b/README.md @@ -1 +1,270 @@ -# git-lab \ No newline at end of file +# Laboratorul 04: Git & Github + +## Version Control + +Un sistem pentru controlul versiuni este un sistem care înregistrează modificările suferite de un fișier sau un grup de fișiere în decursul timpului pentru a facilita revenirea la o versiune specifică ulterior. + +Exista 3 tipuri de sisteme pentru controlul versiunii: + +### Sisteme locale pentru controlul versiunii + +Cele mai vechi VCS-uri (VCS – Version Control System) au presupus că toți dezvoltatorii lucrau în propriile directoare pe un singur sistem de fișiere partajat. Repository-ul a fost păstrat într-un director separat (adesea ascuns). +A face check out si a trimite commit-uri se rezolva prin operații obișnuite cu fișiere, precum copieri și redenumiri. + +### Sisteme centralizate pentru controlul versiunii + +Sistemele locale pentru controlul versiunii au oferit o soluție pentru gestiunea versiunii pentru aplicații dezvoltate de o singură persoană pe un anume sistem. +Din păcate această soluție nu vine în ajutorul persoanelor ce trebuie să colaboreze cu alți dezvoltatori și să interacționeze cu alte sisteme. +Pentru a rezolva și această problemă sistemele centralizate pentru controlul versiunii (CVCS – Centralized Version Control Systems) au fost dezvoltate. + +Sistemele centralizate pentru controlul versiunii (CVCS – Centralized Version Control Systems) (precum CVS, Subversion, Perforce etc) au repository-ul pe un singur server, conectat la retea. +Pentru a face check out, fisierele trebuiesc transferate din server în directorul de lucru. + +Aceasta soluție oferă numeroase avantaje comparativ cu sistemele locale pentru controlul versiunii: toată lumea știe până la un anumit nivel ce fac restul colaboratorilor în cadrul proiectului; +administratorii au la dispoziție o manieră eficientă de a gestiona accesul la resurse și este mult mai ușor de gestionat o bază de date centrală decât una locală pentru fiecare utilizator. + +O problemă evidentă este legată de disponibilitatea nodului central: dacă acesta întâmpină orice fel de problemă o să împiedice orice acțiune din partea utilizatorilor până problema va fi rezolvată. +În plus fiind singurul sistem care conține toate stările fișierelor din cadrul unui proiect, în cazul în care aceste date sunt pierdute recuperarea acestora este de foarte multe ori imposibilă. + +### Sisteme distribuite pentru controlul versiunii + +Dezavantajele și riscurile create de un sistem centralizat pentru controlul versiunii a condus la apariția sistemelor distribuite pentru controlul versiunii (Distributed Version Control Systems – DVCS)(precum Git, Mercurial, Bazaar, Darcs etc), în cadrul acestora utilizatorii nu obțin doar ultima versiune a fișierelor, ci propria copie a repository-ului cu toate versiunile noi și vechi ale proiectului. +Diferitele repository-uri se sincronizează între ele periodic pe rețea. + +Un avantaj este că această abordare adaugă robustețe. +În modelele locale și centralizate, un repository corupt sau un hard disk eșuat poate duce la pierderea tuturor datelor. +În modelul distribuit, vă puteți recupera adesea din astfel de accidentări, deoarece mai mulți dezvoltatori își pot uni repository-le pentru a recupera întregul istoric al proiectului. +Majoritatea echipelor care lucrează cu VCS distribuite vor desemna în continuare un repository ca origine centrală a copiilor lor, pur și simplu pentru că acest lucru simplifică comunicarea în echipă. + +## Avantajele sistemelor de versionare + +Care sunt avantajele folosirii unui sistem de versionare? este salvat istoricul tuturor modificărilor, astfel că se poate reveni oricând la o versiune mai veche dacă se descoperă prin folosirea unui serviciu de hosting, codul sursă are mereu o copie de siguranță online cea mai recentă versiune a codului sursă este mereu disponibilă tuturor dezvoltatorilor, făcând astfel colaborarea și sincronizarea mult mai ușoară decât în cazul trimiterii de fișiere conținând cod sursă dezvoltatorilor interesați de proiect. + +## GitHub + +GitHub este o platformă online, pe care dezvoltatorii o pot folosi pentru a stoca și versiona codul lor sursă. +Git este un sistem de management și versionare a codului sursă care permite lucrul eficient la un proiect software. +Astfel, Git este utilitarul folosit în terminal, iar GitHub este serverul și aplicația web pe care rulează acesta, locul în care păstrăm repository-ul remote. + +### Pregătirea inițială a mediului Git + +``` +$ git config --global user.name "Prenume Nume" +$ git config --global user.email "adresa_de_email@example.com" +$ git config --list +``` +### Crearea unui fork al unui repository + +Notiunea de `fork` nu este specifica git-ului, ci platformelor care stocheaza repository-uri, precum Github si Gitlab. +Fork reprezinta o copie a unui repository, unde creatorul fork-ului poate face modificari, chiar daca nu are drepturi de a modifica repository-ul original. +Pentru a crea un fork al unui repository stocat pe Github, navigati pe pagina repository-ului, apoi apasati butonul "Fork" din dreapta sus. + +### Clonarea unui repository + +``` +$ git clone +``` + +### Remote, origin and upstream + +Termenul de `remote` se refera la locatia unde este stocat un repository, pe un server de git. +La clonarea unui repository de pe Github, este adaugat in mod automat un remote, numit `origin`. +In cazul unui repository obtinut dintr-un fork, `origin` va fi reprezentat de locatia fork-ului. +Orice modificare la repository-ul original nu se va vedea automat si in copie. +Pentru a putea sincroniza cele 2 repository-uri, se foloseste un alt `remote`, numit de obicei `upstream`. + +Pentru a adauga un `remote` numit `upstream`, se poate folosi comanda urmatoare, in folder-ul unui repository: +``` +$ git remote add upstream +``` + +### Sincronizare + +Pentru a aduce modificarile dintr-un repository remote intr-unul local, se foloseste comanda. +``` +$ git pull +``` + +In cazul in care pe repository-ul local este activ un `branch`, comanda de mai sus va sincroniza branch-ul local cu cel remote. + +Exista situatii in care, fiind pe un branch copil, pornit dintr-un branch parinte (ex. `main`), dorim sa integram modificarile din parinte in branch-ul nostru. +Aici intervine notiunea de `rebase`. + +![](images/branches.png) + +### Rebase + +Prin `rebase` se intelege schimbarea bazei unui branch. +Baza unui branch este ultimul commit comun dintre branch-ul copil si branch-ul parinte. + +Cea mai simpla metoda de a integra schimbarile dintr-un branch parinte intr-unul copil este prin folosirea comenzii +``` +$ git pull --rebase +``` + +Pentru a aduce schimbarile din branch-ul `main` din `remote`-ul `origin`, comanda devine + +``` +$ git pull --rebase origin main +``` + +![](images/branches-rebase.png) + +Dupa rebase, daca dorim sa trimitem modificarile catre remote, folosind comanda +``` +$ git push +``` +vom observa ca istoricul de commit-uri nu este cum ne-am astepta. +TODO: diagrama push dupa rebase + +Pentru a avea un istoric curat, e nevoie se folosim comanda +``` +$ git push --force +``` + +Aceasta varianta de `push` va forta suprascrierea istoricului de pe remote cu cel de pe local. + +### Stashing + +Varianta de mai sus functioneaza doar daca schimbarile locale sunt sub forma unui commit. +In cazul in care exista fisiere modificate, dar care nu au fost adaugate intr-un commit, comanda de `pull` va esua. +Pentru asta exista 2 solutii: +1. Crearea unui commit - nu este intodeauna de dorit (nu este finalizat ce vrem sa adaugam) +2. Folosirea functionalitatii de `stash` + +`Stash` ne permite sa salvam modificarile care nu fac parte dintr-un commit. + +Pentru a salva toate modificarile dintr-ul repository, se foloseste comanda +``` +$ git stash push * +``` + +Pentru a salva doar un fisier, se foloseste comanda +``` +$ git stash push +``` + +Restaurarea modificarilor salvate se face cu comanda +``` +$ git stash pop +``` + +Deoarece acest mecanism functioneaza ca o stiva, comanda de `pop` va restaura doar fisierele salvate de ultima comanda de `push`. + +### Merge conflict + +De multe ori, o operatie de `rebase` sau de `stash pop` va duce la un `merge conflict`. +Acesta apare deoarece ultimul commit, `HEAD`, si modificarile pe care vrem sa le aplicam difera, iar diferentele nu apar datorita modificarilor noastre (nu fac parte dintr-un `patch`). +Pentru a intelege aceasta situatie, vom urmari un exemplu. + +Repository-ul curent contine 2 branch-uri, `feature_branch_1` si `feature_branch_2`. +Initial, pe `feature_branch_1` a fost adaugat fisierul `file.txt`. +Branch-ul `feature_branch_2` a fost creat dupa adaugarea fisierului. +Apoi, pe ambele branch-uri au fost facute modificari asupra fisierului. + +![](images/file_branch_1.png) +![](images/file_branch_2.png) + +Daca se decide integrarea schimbarilor de pe branch-ul 1 pe branch-ul 2, va aparea un merge conflict. +Acesta va fi indicat de git, in fisierele in care se afla conflictele. + +![](images/conflict.png) + +Pentru a rezolva un conflict, trebuie urmati urmatorii pasi: +1. Trebuie pastrate una dintre variante, sau ambele, si eliminate delimitatoarele `<<<<<<< HEAD`, `=======` si `>>>>>>> `, apoi salvat fisierul +2. `$ git add ` +3. `$ git rebase --continue`, daca merge conflict-ul a aparut in urma unui rebase, sau `git merge --continue`, in cazul unui merge. + +### Organizarea istoricului de commit-uri + +Cand se adauga un feature nou unui proiect, este bine ca istoricul de commit-uri sa explice schimbarile aduse. +In practica, multi utilizatori realizeaza commit-uri de tipul "Am rezolvat un bug", "Am mai rezolvat un bug". +Commit-urile sub forma asta sunt bune pe procesul de dezvoltare, dar nu si in momentul cand feature-ul este integrat in proiectul mare. +Se prefera urmatoarea forma a commit-urilor: `[componenta majora]: Functionalitate adaugata`. +Orice rezolvare de bug, coding-style sau alte modificari, care fac parte din noua functionalitate, trebuie integrate intr-un singur commit. +Asta nu inseamna ca trebuie facut commitn doar cand totul merge. +Git pune la dispozitie unelte pentru a reface istoricul de commit-uri. + +#### Amend + +Comanda +``` +$ git commit --amend +``` +modifica ultimul commit, prin modificarea mesajului commit-ului, sau a schimbarilor din el. +Problema cu aceasta comanda este ca in istoric vor aparea atat commit-ul vechi, cat si cel modificat cu `--amend`. +De aceea, e necesara folosirea lui `$ git push --force`. + +#### Rebase interactiv + +Comanda +``` +$ git rebase -i +``` +ne permite sa modificam istoricul mai mult decat `--amend`: ne permite sa facem amend, sa imbinam commit-uri (`squash`), sa stergem commit-uri, sau chiar sa le modificam ordinea. +Comanda mai asteapta si intervalul de commit-uri asupra carora se vor face modificarile. +De obicei, acest interval este dat sub forma `@~N`, care inseamna "ultimele N commit-uri". + +#### Reset + +Exista situatii cand este mai simplu sa fie refacut istoricul de commit-uri stergandu-le pe toate si rescriindu-le. +Pentru asta se poate folosi +``` +$ git reset +``` +Aceasta comanda sterge commit-urile, dar pastreaza modificarile aduse de acele commit-uri. +Exista varianta +``` +$ git reset --hard +``` +care sterge si modificarile aduse fisierelor. + +### Bisect + +Uneori (de cele mai multe ori) proiectele vor avea bug-uri. +De cele mai multe ori, vom scrie mult cod, multe commit-uri, apoi vom testa ce am scris. +Problema apare cand s-au facut modificari substantiale, si e nevoie sa fie gasit un bug. +In situatiile in care nu se poate observa citind codul, e nevoie sa trecem prin tot istoricul de commit-uri, unul cate unul, sa vedem unde a aparut problema. +Git pune la dispozitie o unealta pentru a simplifica procesul: `git bisect`. +Aceasta comanda face o cautare binara interval de commit-uri definit de utilizator, cautand primul commit "rau". + +Pentru a folosi `git bisect`, trebuie urmati urmatorii pasi: +1. `$ git bisect start` +2. `$ git bisect bad` +3. `$ git checkout ` +4. `$ git bisect good` + +Dupa aceste comenzi, git va trece prin fiecare commit si va astepta sa fie marcat ca `good` sau `bad`, pana va gasi primul commit `bad` din istoric. + +Pentru a reveni la starea de dinainte de `git bisect start`, se foloseste comanda `git bisect reset`. + +## Exercitii: + +1. Faceti fork repository-ului, cu optiunea de a copia si branch-urile existente. +Clonati repository-ul obtinut. +Adaugati un remote `upstream` catre repository-ul original. +2. Echipa a decis ca nu se vor mai adauga feature-uri in plus. +Faceti schimbarea pe branch-ul `feature_branch_2`, pentru a fi la zi cu modificarile de pe branch-ul `feature_branch_1`. +Pastrati linia cu "big boss". +Creati un pull-request, din interfata GitHub, catre branch-ul `feature_branch_1` din fork-ul vostru. +Adaugati asistentul de la laborator ca reviewer. + +Pentru urmatoarele exercitii, veti lucra pe diferite branch-uri din acest repository, cu un program scris de un intern imaginar, de la o firma imaginara. +Programul trebuie sa citeasca un numar de la tastatura, si sa intoarca valoarea citita adunata cu 5. +Pentru fiecare exercitiu, veti crea un pull request catre branch-ul `main` din fork-ul vostru. + +3. Folosind `git commit --amend`, modificati mesajul de commit al ultimului commit de pe branch-ul `amend_branch`. +Nu conteaza in ce modificati mesajul. +4. Pe parcursul dezvoltarii, intern-ul a introdus un bug: numarul citit nu se aduna cu 5. +Folosind `git bisect`, gasiti commit-ul care a introdus bug-ul. +(Nu conteaza daca e evident unde apare, folositi `bisect`). +Adaugati un commit care rezolva problema, pe branch-ul `bisect_branch`. +5. Folosind `git rebase --interactive`, faceti `squash` tuturor commit-urilor de pe branch-ul `rebase_interactive_branch` care nu adauga o functionalitate noua. +6. Folosind `git reset`, eliminati toate commit-urile de pe branch-ul `reset_soft_branch` si creati un singur commit cu intreaga implementare. +7. Manager-ul intern-ului tocmai a zis ce task avea de fapt de facut: sa genereze un numar random in 5 moduri diferite. +Folosind `git reset --hard` Eliminati toate modificarile de pe branch-ul `reset_hard_branch`, si implementati ce i s-a cerut de fapt. +(E o mica provocare sa gasiti a 5-a metoda - nu citire din `/dev/random` sau `rdseed`). + +## Feedback + +Daca ceva nu a mers, sau ati mai fi dorit sa fie si alte chestii in acest laborator, adaugati un issue. diff --git a/images/branches-rebase.png b/images/branches-rebase.png new file mode 100644 index 0000000000000000000000000000000000000000..cf90491e5c8b28cc70f72994a18771ec913268f5 GIT binary patch literal 3800 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 literal 0 HcmV?d00001 diff --git a/images/conflict.png b/images/conflict.png new file mode 100644 index 0000000000000000000000000000000000000000..639cbb80651a82921c4fc66d207a8fb64e0f19a4 GIT binary patch literal 15926 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 literal 0 HcmV?d00001 diff --git a/images/file_branch_2.png b/images/file_branch_2.png new file mode 100644 index 0000000000000000000000000000000000000000..39efcd729b870043b6cf81a39b26094956eae225 GIT binary patch literal 10256 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 N`t +#include +#include +#include +#include +#include + +using namespace std; + +int get_random_std() +{ + return rand() % 200; +} + +int get_random_rdrand() +{ + unsigned int ret; + + int rc = _rdrand32_step(&ret); + + if (rc == 1) + return ret; + else + return -1; +} + +int get_random_dev_urandom() +{ + int ret, read; + + FILE *urandom = fopen("/dev/urandom", "r"); + + read = fread(&ret, sizeof(ret), 1, urandom); + + fclose(urandom); + + if (read > 0) + return ret; + else + return -1; +} + +int get_random_getrandom() +{ + int ret, read; + + read = getrandom(&ret, sizeof(ret), 0); + + if (read > 0) + return ret; + else + return read; +} + +int get_random(int (*random_func)()) +{ + return random_func() % 200; +} + +typedef int (*fp)(); + +int main() +{ + int n; + + cout << "Please enter a number" << endl; + cin >> n; + + uint32_t rnd; + + srand((unsigned) time(NULL)); + + vector randoms = { get_random_getrandom, get_random_dev_urandom, get_random_rdrand, get_random_std }; + + for (int i = 0; i <= 5; i++) + { + if (get_random(randoms[i % 4]) == 150) + { + n += 1; + } + else + { + i--; + } + } + + cout << "Your number + 5 is: " << n << endl; + + return 0; +}