Înainte de a începe să rezolvați laboratorul asigurați-vă că ați parcurs și
înțeles noțiunile prezentate în sectiuniile Concepte
și Demo
.
La calea ~/uso-lab/04-appdev/support/basics/simple.c
se află un program simplu C care afișează bine-cunoscutul mesaj “Hello, World!”.
#include <stdio.h> int main(void) { puts("Hello, World!"); return 0; }
Cel mai folosit compilator de C folosit pe Ubuntu este gcc
. Acesta va fi folosit și de noi În cardrul laboratorului să compilăm fișiere scrise în limbajul C.
Pentru a compila un fișier, rulăm comanda gcc
urmată de numele fișierului pe care vrem să-l compilăm.
student@uso:~/uso-lab/04-appdev/support/basics/$ gcc simple.c student@uso:~/uso-lab/04-appdev/support/basics/$ ls a.out simple.c student@uso:~/uso-lab/04-appdev/support/basics/$ file a.out a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=c5ad78cfc1de12b9bb6829207cececb990b3e987, not stripped
Outputul produs de această comandă este un fișier executabil cu numele a.out
. Comanda file
ne ajută să inspectăm tipul fișierului dat ca argument. În acest caz, ne spune că fișierul a.out
este de tip ELF pe 64 de biți.
simple
. Compilați programul simple.c
astfel încât fișierul rezultat să se numească simple
(hint: man gcc, căutați după cuvântul cheie outfile
).file
, verificați că fișierul simple
este într-adevăr un fișier executabil.
Așa cum a fost precizat și la secțiunea Concepte
, git ne ajută la versionarea codului. Versionarea codului este un pas
foarte important în dezvoltarea aplicațiilor. Atunci când lucrăm la un proiect mai mare sau suntem mai mulți oameni care lucrăm
la un proiect, este important să păstrăm o ordine în cod. Spre exemplu, ni se poate întâmpla să ne apucăm să implementăm un nou
feature al aplicației și să modificăm codul suficient de mult încât să stricăm ceea ce aveam înainte. În această situație, vrem
să avem o modalitate prin care să revenim la o versiune anterioară a codului. Un alt exemplu care demonstrează nevoia de a folosi
o modalitate de versionare este dat de situația în care 2 sau mai mulți oameni lucrează la același proiect, dezvoltă două
funcționalități diferite și nu vor să aibă probleme atunci când vor imbina cele 2 funcționalități în produsul mare.
Vom trece prin exemplele de mai sus în secțiunile următoare. Acum, ne vom concentra pe inițializarea proiectului.
Pentru a putea versiona codul pe care îl scriem, trebuie întâi și întâi să avem un loc în care să scriem codul. Ne reamintim din
laboratoarele anterioare cum se creează un director în Linux. Să presupunem că pornim din directorul home
al uitlizatorului
student
. Dacă nu vă aflați acolo, rulați comanda cd ~
.
student@uso:~$ mkdir my-awesome-project student@uso:~$ cd my-awesome-project student@uso:~/my-awesome-project$
În acest moment, avem directorul în care vom lucra la proiectul nostru. Pentru a preciza sistemului că vrem să folosim git
pentru versionare, trebuie să dăm comanda git init
. Această comandă creează un repository local nou în care vor fi
ținute toate datele legate de proiect. Vom vorbi despre repository-uri remote la secțiunile următoare.
student@uso:~/my-awesome-project$ git init Initialized empty Git repository in /home/student/my-awesome-project/.git/ student@uso:~/my-awesome-project$
Dacă această comandă s-a executat cu succes, avem în acest moment un repository de git
în directorul my-awesome-project
. Dacă dăm comanda
git status
putem afla foarte ușor ce fișiere am modificat de la ultima actualizare a repository-ului.
student@uso:~/my-awesome-project$ git status # On branch master # # Initial commit # nothing to commit (create/copy files and use "git add" to track) student@uso:~/my-awesome-project$
Dat fiind faptul că nu am create/șters/modificat niciun fișier din directorul my-awesome-project
, comanda git status
ne spune că nu avem
nicio schimbare pe care să o “comitem”, adică nu avem nicio schimbare în directorul curent pe care ar trebui să o anunțăm.
Uzual, orice proiect vine atașat cu 2 fișiere README
și un fișier .gitignore
. Fișierul README
conține informații despre cum este structurat
proiectul, despre cum se folosește, practic conține orice are nevoie pentru a putea ajuta pe cineva (care nu a lucrat la proiect). Fișierul .gitignore
este fișierul care îi spune utilitarului git
ce fișiere să ignore atunci când cineva adaugă fișiere la repository. Spre exemplu, fișierele binare
nu trebuie adăugate niciodată în repository deoarece este foarte, atenție foarte, probabil ca un program compilat pe un sistem să nu fie compatibil
pe un altul.
Primul pas pe care trebuie să-l facem după ce am inițializat repository-ul proiectului nostru este să adăugăm un fișier README, care va fi actualizat pe
parcursul dezvoltării și un fișier ascuns cu numele .gitignore
.
student@uso:~/my-awesome-project$ echo "Initial content" > README # Scrie textul ''Initial content'' în fișierul ''README''. Fișierul este creat dacă nu exista deja. student@uso:~/my-awesome-project$ echo "main" > .gitignore # Creează fișierul .gitignore cu conținutul ''main''. student@uso:~/my-awesome-project$ git status # On branch master # # Initial commit # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # .gitignore # README nothing added to commit but untracked files present (use "git add" to track)
Comanda git status
ne arată că au fost modificate cele 2 fișiere, dar că sunt untracked
, adică nu au fost adăugate (încă în repository). Pentru a le adăuga,
trebuie să facem 2 pași. Prima dată, le adăugam în setul de fișiere tracked
. Pentru a face asta folosim comanda git add
urmată de fișierele pe care vreți să
le adăugați, în cazul acesta README
și .gitignore
.
student@uso:~/my-awesome-project$ git add README .gitignore student@uso:~/my-awesome-project$ git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: .gitignore # new file: README #
În acest moment git
știe de fișierele README
și .gitignore
. Vedem acest lucru cu ajutorul comenzii git status
. Al doilea pas este să comitem schimbările.
Acest lucru se face cu ajutorul comenzii git commit
alături de argumentul -m <mesaj>
. Mesajul este o descriere a commit-ului, descrie ce modificări au fost
aduse odată cu aceasta versiune nouă de cod. git commit
va lua toate fișierele adăugate la pasul anterior, le va marca pe toate cu același mesaj de commit și le va
submite în repository-ul local.
student@uso:~/my-awesome-project$ git commit -m "Initial commit" [master (root-commit) 64bccb0] Initial commit Committer: student <student@uso> 2 files changed, 2 insertions(+) create mode 100644 .gitignore create mode 100644 README student@uso:~/my-awesome-project$ git status # On branch master nothing to commit, working directory clean
La o nouă rulare a comenzii git status
vedem că schimbările au fost efectuate cu succes. Pentru a vedea istoricul commiturilor
făcute pentru acest repository rulăm comanda git log
. Acum trebuie să vedem că a fost efectuat un singur commit de-a lungul timpului
și anume cel cu identificatorul 64bccb03c2f3a8e76730582676bd944902a0c1eb
. Acest șir de caractere în hexazecimal este generat aleator și este unic pentru fiecare commit, ajutându-ne astfel să identificăm commit-urile în cazul în care ar exista mai multe cu același nume.
student@uso:~/my-awesome-project$ git log commit 64bccb03c2f3a8e76730582676bd944902a0c1eb Author: student <student@uso> Date: Mon Oct 7 15:49:20 2019 +0300 Initial commit
main.c
în directorul ~/my-awesome-project/
care să afișeze mesajul “Hello, World!”.git
vede această schimbare folosind comanda git status
. Ar trebui să vedeți următorul output:# On branch master # # Initial commit # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # main.c
git status
nu ar trebui să mai găsească niciun fișier ca 'tracked'. Verificați folosind git log
sau chemând asistentul.