Git-ul este o unealtă esențială în viața oricărui programator (și nu numai). Ca și definiție, el este un sistem de versionare (version-control) care urmărește modificările fișierelor și care poate ajuta colaborarea între mai multe persoane care lucrează la un anumit proiect.

Pentru a instala Git, vom urma instrucțiunile de aici:

https://git-scm.com/book/en/v2/Getting-Started-Installing-Git

Pentru a utiliza Git, o să aveți nevoie de un Terminal (Linux) sau de un Shell (Windows, recomandat PowerShell -> run as administrator). Există și interfețe grafice pentru folosirea Git-ului, dar nu vom discuta despre ele aici.

Git-ul are repositories, sau pe scurt ”repo”-uri. În momentul în care vrem să creem un nou repo, mergem în folder-ul pe care vrem să îl ”botezăm” ca și git repo și îi zicem git init.

Linia de comandă ne va informa

Initialized empty Git repository in /home/florin/Projects/test2/.git/

Asta înseamnă că în acest folder putem să rulăm comenzi specifice unui repo git. Ne propunem să creem un fișier index.html în care scriem niște cod HTML. Și dacă tot suntem aici, facem și un main.js și un main.css.
Astfel, dacă întrebăm git-ul care este statusul curent folosind git status, acesta ne va spune următoarele:


Git Workflow

A venit și momentul să învățăm care îi treaba cu acest ”workflow”. Ei bine, e foarte simplu.

Inițial, atunci când noi facem modificări la fișiere, acestea se vor afla în prima stare (de existing changes). Așa cum le-am văzut și când am dat git status. În momentul în care vrem să le propunem pentru un commit, ele vor intra în starea de staged. Pentru a face acest lucru, vom folosi comanda de git add. Această comandă acceptă ca și parametrii nume de fișiere. Așa că putem să zicem

git add index.html
git add main.css
git add main.js

// sau
git add index.html main.css main.js

// sau
git add .
// windows
git add *

Fie putem să adăugăm unul pe rând, sau putem să înșiruim fișierele unul după altul, folosind spații între ele. Iar atunci când suntem siguri pe noi că toate modificările sunt bune, putem să folosim fie punct ., fie steluța *.

După ce fișierele ajung în starea de staged, git status ne va zice ceva de genul:

Fișierele sunt pregătite pentru commit.

git commit -m "primul meu commit. adaugat index.html, main.css, main.js"

Dacă primiți o eroare în care vă informează că nu vă recunoaște, trebuie să urmați pașii de configurare a email-ului și a user-ului (aveți un exemplu în textul afișat de eroare).

Este recomandat ca de fiecare dată când adăugăm un commit, să scriem un mesaj scurt și la obiect, care descrie ceea ce am modificat, adăugat sau sters prin acel commit. De asemenea, e bine ca commit-urile noastre să includă funcționalități "atomice". Astfel, dacă in fișierul main.js adăugăm niște cod care interacționează cu un anumit element <div class="content"></div>, este indicat să adăugăm atăt fișierul main.js care conține modificările din JavaScript, cât și index.html care conține div-ul.

După ce commit-ul s-a executat cu succes, ajungem în ultima stare, cea de commited. Ultimul commit care a fost făcut se numește HEAD commit și indică cea mai recentă versiune a branch-ului pe care ne aflăm.


Ce îi ăla un branch?!

Ah da, corect. Pe scurt, un branch poate fi folosit pentru a dezvolta funcționalități noi, într-un mediu izolat de restul codului (care până în momentul actual, știm foarte bine că merge). Atunci când inițializăm un repo nou, git-ul ne adaugă un branch "default" care se numește master. În cazul în care vrem să facem un branch nou, îi putem spune

git checkout -b fix_bug_22

aici putem să facem diverse modificări, pe care le comitem

git commit -m "commit1"
git commit -m "commit2"

După ce am făcut commit-urile pe branch, putem să ne mutăm înapoi pe master, iar de pe master, înapoi pe branch. Codul se modifică automat.

git checkout master

git checkout fix_bug_22

Pentru a șterge un branch, git branch -d fix_bug_22.

Iar pentru a aduce modificările făcute pe branch în master, folosim merge. În timp ce ne aflăm în branch-ul în care vrem să aducem modificările (pentru exemplu, master) îi vom zice

git merge fix_bug_22

Ok, și care îi treaba cu GitHub-ul ăsta?!

Ei bine, e foarte tare că putem să versionăm codul pe care îl scriem, dar în continuare doar noi putem să vedem aceste schimbări.

Ei bine aici intervine GitHub-ul, care este o platformă care ne oferă Git-ul ca și serviciu web. Astfel, noi putem să ne salvăm repo-urile online, și să avem un link de acces la ele oricând avem nevoie. Desigur, există multe alte feature-uri interesante și folositoare pe care GitHub le oferă.

După ce ne facem un cont pe GitHub, putem să adăugăm un repo nou folosind butonul de New de pe prima pagină, și după ce îi dăm un nume, ne va apărea o pagină care descrie cum să procedăm mai departe.

Din moment ce noi avem deja un repo local, putem să îl conectăm cu repo-ul nostru din GitHub. Pentru a face asta copiem acel link (să ne asigurăm că avem HTTPS selectat).

Mergem în linia de comandă și îi vom zice git-ului să adauge o legătură de tip remote (numită origin) către GitHub repo-ul nostru.

git remote add origin <URL_COPIAT_DE_PE_GITHUB>
    
git push origin master

Ca ulterior să îi zicem să facă push către branch-ul master de pe origin. Cel mai probabil o să trebuiască să vă logați, iar după ce push-ul a fost făcut, codul vostru ar trebui să se afle pe repo-ul vostru de GitHub.

Pentru a trimite modificări către remote, folosim push. Iar pentru a lua modificările făcute probabi de altcineva (sau tot de noi, dar de pe un alt calculator) trebuie să îi zicem pull.

git pull origin master

Comenzile de push și pull pot fi folosite cu orice branch pe care îl avem.

Ultimul lucru pe care îl mai precizez este că putem să luăm un repo scris de altcineva, si să îl folosim sau să lucrăm pe el. Pentru a face acest lucru, vom folosi un procedeu foarte complex de clonare.

Bine, nu este deloc complex, ci chiar foarte simplu. Tot ce avem nevoie este de link-ul către repo. Putem să îl cerem persoanei sau să îl luăm direct de pe GitHub (pe pagina repo-ului este un buton verde cu Clone or download) iar apoi în linia noastră de comandă îi spunem

git clone https://github.com/<user_name>/<repository_name>/

iar Git-ul ne va face un folder nou care conține tot repo-ul. That easy.


Pentru studenți

GitHub oferă un pachet de resurse și unelte extraordinar de folositoare pentru studenți, alături de repository-uri private gratuite. Mai multe detalii despre acest pachet puteți să găsiți aici:

https://education.github.com/pack


Ok, și ce fac mai departe?

Mai departe, începi să folosești Git. Only practice makes the master. Lucreză împreună cu cineva la un proiect comun folosind Git. Iar când îți vei rezolva singur conflictele, atunci vei stăpâni Git-ul cu adevărat. (cine este confuz, o să înțeleagă ulterior).

Iar dacă ați trecut cu bine prin comenzile expuse mai sus, vă recomand

git log
git diff
git stash

They are life savers.

O resursă folositoare și simplă (din care m-am inspirat) puteți găsi aici.

http://rogerdudler.github.io/git-guide/