Introducere în Git

Ce este Git?
Un sistem de gestionare a versiunilor fișierelor dintr-un dosar (numit și folder sau director). Altfel spus, un program care înregistrează fiecare modificare dintr-un dosar de-a lungul timpului, astfel încât utilizatorii acelui dosar pot să se întoarcă în orice punct din istoria dosarului sau pot analiza evoluția lui de-a lungul timpului. O funcție foarte importantă a Git este cea de „ramuri”, prin care istoria unui dosar poate evolua concomitent în mod diferit în mai multe „ramuri” (create cu „git checkout -b” sau cu „git branch”), și într-un moment ales acele ramuri pot fi unificate (cu comanda „git merge”) Ceea ce face Git cu adevărat folositor este funcția de „remote”-uri, adică servere pe care git încarcă întreaga istorie a unui dosar permițând colaborarea mai multor utilizatori asupra aceluiași dosar. Exemple de servicii care folosesc Git pentru a permite colaborarea utilizatorilor asupra unor proiecte sunt GitHub și BitBucket. GitHub este cel mai popular, dar BitBucket permite crearea unui număr nelimitat de depozite Git private.

Cum se instalează Git?
Pe sistemele Linux care folosesc managerul de pachete apt-get (inclusiv distribuția Linux Ubuntu), Git se instalează cu comanda „sudo apt-get install git”. Pe Windows, Git se instalează folosind programul executabil de instalare de pe site-ul Git și în funcție de opțiunile alese în timpul instalării va fi utilizarea ulterioară Git: fie veți putea utiliza Git în orice fereastră Command Prompt, fie veți putea utiliza Git doar din programul Git Shell.

Cum se folosește Git?
Odată instalat Git poate fi folosit prin comenzile în linia de comandă (cu alte cuvinte în terminal) pe care le oferă. Există însă și programe cu interfață grafică pentru utilizator care fac utilizarea Git mai ușoară în unele cazuri, de exemplu, SourceTree și GitHub for Desktop (ambele compatibile cu Windows 7 și versiuni mai târzii de Windows și cu OS X 10.9 și versiuni mai târzii de OS X), dar care nu fac obiectul acestui articol.

Trecem în revistă câteva comenzi mai importante (care se rulează din directorul în care se dorește urmărirea modificărilor fișierelor, director în care se intră cu ajutorul comenzii „cd”).
git init
Această comandă transformă directorul curent într-un depozit Git, indiferent dacă directorul curent este gol sau nu. Această comandă nu este influențată de conținutul directorului și nu afectează conținutul directorului decât că practic, această transformare constă doar în crearea directorului (ascuns pe sistemele Linux) „.git” în interiorul directorului curent. Acest dosar conține informații folosite în mod intern de Git pentru gestiunea versiunilor dosarului.
git add X
Această comandă marchează fișierele sau dosarele X aflate în interiorul dosarului depozitului Git ca făcând parte din „staging area”. Aceste fișiere vor fi înregistrate în istoria dosarului la următoarea rulare a comenzii „git commit”. Această operațiune nu are sens decât dacă ați efectuat modificări asupra fișierelor/subdosarelor X de la ultimul commit, sau de la crearea depozitului git (în cazul în care nu există încă niciun commit), sau X reprezintă fișiere noi care până acum nu au fost adăugate în depozit. Ne putem imagina „staging area” ca pe un coș folosit de un om pentru a culege merele (schimbările din directorul de lucru, directorul depozitului) dintr-o livadă. Există mai multe coșuri pline puse unul lângă altul care formează istoria depozitului.
git commit -m "Test"
Această comandă înregistrează modificările adăugate cu „git add” în „staging area” ca o nouă versiune a dosarului în istoria dosarului și apoi golește „staging area” pregătind-o pentru noi modificări. În loc de „Test” se poate scrie orice șir de caractere care reprezintă o descriere a ultimelor modificări ce vor fi înregistrate, iar dacă se dorește chiar introducerea unui caracter „"” în interiorul mesajului de commit, se tastează „\"” în loc de „"”. Istoria dosarului poate fi văzută rulând comanda „git log”.
git log
Această comandă afișează jurnalul commit-urilor din depozitul directorului curent. O versiune a acestei comenzi care afișează jurnalul mai frumos în opinia mea este „git log --graph --color --decorate --all --date=relative”. Dacă vă place mai mult această afișare, o puteți folosi mai ușor printr-un alias creat cu următoarea comandă: „git config --global alias.mylog "log --graph --color --decorate --all --date=relative"”. Astfel veți putea folosi pentru aceeași funcție comanda „git mylog”.

În final, închei cu fluxul de lucru Git, tradus de aici:
1. modifici fișierele din directorul de lucru (depozitul Git);
2. „montezi” (în engleză „to stage”) fișierele, adăugând instantanee ale lor în aria de montare („staging area”);
3. faci un commit, care ia fișierele așa cum sunt ele în aria de montare și stochează acel instantaneu permanent în directorul Git („.git”).

Unde pot afla mai multe despre Git și unde pot cere ajutor?
Documentația oficială Git este extraordinar de bună, dar este în limba engleză. Dacă preferați limba română, cred că vi se va răspunde cu plăcere pe forumul Softpedia. Dacă aveți cunoștințe medii de limbă engleză puteți cere ajutorul pe site-uri precum StackOverflow.

Va urma.

Cum modifici mesajele de commit ale unor commit-uri Git din trecut

1. Cum schimbi mesajul de commit al ultimului commit

În următorul mod poți preciza noul mesaj de commit în linia de comandă:
git commit –amend -m "Mesaj nou"
În următorul mod se deschide un editor (de exemplu Vim) pentru editarea mesajului de commit anterior:
git commit –amend -e 
2. Cum schimbi mesajele de commit ale unor commit-uri din trecut (unul sau mai multe)

Această metodă funcționează doar dacă nu s-a făcut push la commit-urile respective sau dacă este vorba doar despre un depozit git local fără remote-uri.
git rebase -i X
unde X este ID-ul commit-ului aflat în cronologia commit-urilor chiar înainte de primul commit al cărui mesaj vrei să îl schimbi, și care se poate afla executând:
git log
În loc de ID-ul commit-ului poate fi (și deseori e mai folositor) un reper de tipul HEAD, HEAD~1 (commit-ul dinaintea ultimului commit), HEAD~2 (commit-ul dinaintea penultimului commit) etc.

Această comandă (rebase) va deschide editorul de text configurat pentru asta (de exemplu Vim) cu o listă de commit-uri, câte unul pe fiecare rând, și la începutul fiecărui rând va fi precizată comanda „pick” care înseamnă că acel commit nu va dispărea în urma rebase-ului.



Commit-urilor cărora doriți să le schimbați mesajul de commit schimbați-le comanda „pick” în „reword”, salvați fișierul și ieșiți din editor.



După ieșirea din editor, pentru fiecare commit la care s-a setat comanda „reword” se va deschide iar editorul pe rând cu vechiul mesaj de commit și aveți posibilitatea de a scrie un alt mesaj de commit sau să îl modificați pe cel vechi.

E important de menționat că rebase-ul va schimba ID-ul commit-urilor modificate deci trebuie făcut cu grijă când commit-urile se află și pe un server, deci nu sunt doar locale.

Dacă aveți întrebări sau sugestii, vă rog să scrieți comentarii mai jos.

Introducere în programul de editare de text Vim

Puteți citi mai multe despre acest program în articolul Wikipedia în limba română despre vim (sau via Wikiwand) sau în cel în limba engleză (sau via Wikiwand).



Pentru mine, Vim este folositor din următoarele motive:
- este foarte (ușor) extensibil și după ce te familiarizezi cu comenzile (și poate chiar începi să îți faci tu propriile comenzi!) devii foarte productiv;
- poate fi folosit direct din terminal pe sistemele de operare Linux (de exemplu, Ubuntu în cazul meu) ceea ce permite un flux de lucru frumos și productiv.



Pe Ubuntu, Vim se poate instala executând în terminal:
sudo apt-get install vim vim-gtk
(Am inclus și instalarea pachetului vim-gtk în comandă deoarece acest pachet permite utilizarea clipboard-ului cu comenzile "+y, "+p, "+d.)

Pentru Windows există un program de instalare automat, care poate fi descărcat aici și care creează o scurtătură în meniul Start.

Pe Linux, programul Vim se pornește rulând din terminal comanda „vim”. Pentru a deschide un fișier se rulează comanda „vim [cale_fișier]” unde „cale_fișier” este o cale relativă sau absolută către fișierul pe care doriți să îl editați. Recomand mult comanda „vimtutor” care oferă o introducere simplă și practică în limba engleză a comenzilor de bază pentru utilizarea Vim.



După deschiderea unui fișier în Vim, Vim are mai multe moduri de funcționare (sau de editare) printre care și:
- modul normal - în care se execută comenzi de editare pentru modul normal (în general mai simple decât cele pentru modul linie de comandă), acesta este modul în care intră Vim automat la pornire;
- modul de inserare - în care se introduc caractere, pentru trecerea în acest mod din modul normal se introduce comanda „i” (pur și simplu se apasă tasta „i”);
- modul de înlocuire - la fel ca modul de inserare dar caracterele introduse înlocuiesc caracterele deja existente pe pozițiile cursorului, pentru intrarea în acest mod din modul normal se apasă combinația de taste Shift+R (altfel spus, se apasă simultan tastele Shift și R, care împreună formează caracterul „R” mare);
- modul linie de comandă - în care se introduc comenzi mai complexe care încep cu caracterul „:”, pentru a intra în acest mod pornind din modul normal, se apasă „:”;
- modul vizual - în care se lucrează cu secțiuni din fișier selectate în mod vizual, pentru a intra în acest mod din modul normal se introduce comanda „v” pentru selectarea caracter cu caracter sau „V” pentru selectarea rând cu rând.


După ce veți lucra cu Vim mai mult și vă veți familiariza cu el, veți realiza că fișierul „.vimrc” este inima lui Vim. Puteți vedea fișierul meu „.vimrc” aici. Sper să vă fie de ajutor. În viitor sper să scriu un articol numai despre fișierul (meu sau nu doar al meu ci în general) „.vimrc”.


Dacă aveți curiozități sau întrebări legate de Vim, vă este de mare ajutor cunoașterea limbii engleze și site-uri precum acesta unde puteți pune întrebări, da răspunsuri, câștiga reputație, totul în legătură cu Vim (și Vi).



Va urma.

Dacă aveți întrebări sau sugestii, vă rog să scrieți comentarii mai jos.

Recomandare software: Evernote

Evernote este un program excelent pentru luarea de notițe. Notițele pot fi etichetate și introduse în „caiete” (notebooks). Funcția de căutare este foarte bună și organizarea notelor prin etichete este foarte eficientă. Notele pot avea fișiere anexate (versiunea gratuită a Evernote permite maxim 60MB de fișiere pe lună, ceea ce pentru mine e suficient). Recent, interfața web Evernote a fost îmbunătățită mult și acum Evernote poate fi folosit cu mai multă ușurință pe alte sisteme de operare decât Windows, dar clientul Windows rămâne produsul lor de cea mai bună calitate. Există o extensie de browser oficială Evernote Web Clipper cu care puteți salva pagini web sau părți din pagini web în notițe care păstrează și originea lor, și păstrează și imaginile, stilul în mare parte.

Site-uri

Cateva site-uri care mi-au placut sau pe care le-am gasit folositoare:

- http://www.remember-to-breathe.org/ - un site despre sănătatea psihică și respirație: „Amintește-ți să respiri!”;
- http://www.romanianvoice.com - aici gasiti multe poezii romanesti.
- http://math-pdr.com/ - un site foarte folositor pentru elevii de liceu care se pregătesc pentru BAC - lecții audio-video de matematică cu rezolvări complete de probleme de toate felurile
- http://www.romaniapozitiva.ro/
- http://ro-en.gsp.ro/ - un dicționar online român-englez și englez-român bun
- http://alternativeto.net/ - alternative software la software

Programe pe care le-am folosit și mi-au plăcut

WatchaDoing - http://fish-bytes.com/whatchadoing/index.html - aplicația se instalează din browser, prin Flash care instalează Adobe AIR. E pentru un fel de jurnal de activitate digital, te întreabă periodic ce faci și îți arată rapoarte.

https://addons.mozilla.org/ro/firefox/addon/unclrd/ - add-on („extensie”) pentru Firefox care afiseaza paginile web in alb si negru. Pe cateva pagini nu merge bine si derularea paginilor e mai inceata, dar cand vrei doar textul paginii, e mai placut sa nu-ti fure atentia culori fara folos.

Open Tabs Next to Current - add-on/extensie pentru Firefox care face ca deschiderea de noi tab-uri să aibă loc imediat după tab-ul selectat/activ/curent.

Open Link in Silent Tab.

http://www.xmind.net/ și http://freemind.sourceforge.net/wiki/index.php/Main_Page - Programe pentru crearea de „mind maps” sau diagrame de tip pânză de păianjen, sau diagrame în care în centru se află o idee care se dezvoltă prin ramificații. Câteva din mind-map-urile mele făcute cu XMind se găsesc pe acest blog, aici.

Glume pentru programatori

The march of progress:

C:
printf("%10.2f", x); 

C++:
cout << setw(10) << setprecision(2) << showpoint << x; 

Java:
java.text.NumberFormat formatter = java.text.NumberFormat.getNumberInstance();
formatter.setMinimumFractionDigits(2);
formatter.setMaximumFractionDigits(2);
String s = formatter.format(x);
for (int i = s.length(); i < 10; i++) System.out.print(' ');
System.out.print(s);

Actualizare 10.08.2017:

Python:
print("{:10.2f}", x)