joi, ianuarie 28, 2010

Despre Git

Din ciclul "O tehnologie pe zi".

Cu cca. 2 ani în urmă auzisem de la un coleg despre Git și Mercurial ca fiind un nou model de source control ce permite partajarea surselor în mod distribuit între membrii echipelor fără a depinde în mod special de un repository central. N-am avut timp să aprofundez subiectul până zilele trecute, când mi-a venit ideea organizării timpului astfel încât să nu aloc mai mult de 1 zi pentru a afla mai multe detalii despre o tehnologie anume.

Primul pas, ca de obicei, a fost să caut pe Google "git source control".
Evident, din primul rezultat am ajuns pe site-ul principal: Git the fast version control .

Momentan, la joobs.ro folosim Subversion, iar la MaxCode Team Foundation Server. Amândouă se bazează pe un repository central unde este localizat codul sursă. Un dezavantaj atunci când legătura cu repository-ul central nu e disponibilă (de ex. nu ești prezent în rețeaua locală, nu ai acces la Internet, ...).

De ce aș continua cu o schimbare? Nu e simplu să renunți la ceva care știi că merge și te-ai obișnuit, dar când e vorba despre eficiență merită să investești timp și să înveți lucruri noi pentru a lucra mai bine în echipă.

În caz că nu ați aflat singuri sau nu știați, Git a fost dezvoltat inițial de Linus Torvalds (are rost să spun cine e? nu, desigur!). Un coleg spune ca a fost dezvoltat într-o singură săptămână (cele mai importante functionalități). O fi folosit un mediu RAD!? (glumesc, evident!)

Totuși, care este impresia după o zi de test?

În primul rând am găsit tot ce aveam nevoie ca și unelte: integrare cu sistemul de fisiere Windows și suport în mediile de dezvoltare Visual Studio 2008/2010. Git Extensions e tot ce ai nevoie pentru a rula Git.
Recomandare: citește manualul pentru a întelege cum se creează un repository local sau cum lucrezi cu un repository  la distanță.

Aici găsești documentație suficientă pentru a înțelege în câteva ore care sunt conceptele din spate (branch, patch, merge, local repository, remote repository).

Mi-a plăcut să văd că există documentație și pentru designeri. (hei @silvius, ce spui?)

Să revenim la Git, ce oferă/ce diferă/ce mi-a plăcut?
  • mod de lucru deconectat de repository central (îți poți aduce în repository local ultimile surse, pe care apoi le poți modifica, efectua commit local, ca apoi să publici commit-urile locale în repository-ul central).
  • mod de lucru distribuit, adică îți poți imagina un membru în echipă care își face o copie locală (branch) și efectuează schimbări/refactoring la code, iar în final trimite (să zicem prin e-mail, vezi suportul pentru patch-uri) schimbările către un coleg să facă review la cod, schimbări care dacă sunt ok le poate publica apoi într-un repository central (push);
  • posibilitatea de a crea foarte ușor branch-uri locale pentru diverse scopuri (un nou build, release, implementarea unei noi funcționalități care nu dorim să afecteze build-ul curent, bug fix, etc);
  • posibilitatea de a face merge între branch-uri;
  • posibilitatea de a avea un singur director de lucru pentru care alegi branch-ul activ (posibil și cu Subversion);
  • posibilitatea de a reface un changeset în cazul în care s-au omis fișiere la commit;
  • nu-s prea încântat de kdiff pentru compararea și  unirea (vs. merge) de fișiere, mă simt mai confortabil cu unealta din TFS;
  • posibilitatea de a face checkout la o revizie anterioara (astfel poti să testezi cum arătau sursele la un moment anterior fără a avea un branch);
  • operații simple pentru lucru cu repository central (pull, push);
  • integrarea cu Visual Studio și Windows Explorer;
  • posibilitatea de a asocia etichete (Tags) la revizii (astfel poti să marchezi la un moment dat că o revizie reprezintă o anumită versiune a aplicației);
Câteva resurse:
Folosești Git? Eu încă nu, dar recunosc că sunt impresionat de ceea ce oferă și intenționez să-l pun la lucru. :)

Mult spor!
Următorul post va fi despre jQuery! (tocmai am ridicat cartea comandată pe bookdepository.co.uk)
(Sfat: urmărește comentariile de mai jos pentru a descoperi noi unelte pentru Git.)

Bookmark This

4 comentarii:

valentinu spunea...

Folosesc git de mai bine de jumatate de an si e o experienta foarte buna. O experienta foarte buna pana cand trebuie sa il introduci colegilor tai care afla prima oara ce inseamna "version control". Incepatorii mei prefera VSS (the horror..)

Git Extensions e tool-ul potrivit pentru integrarea cu Visual Studio. Gandeste-te sa tii repository-ul central intr-un folder share-at prin dropbox. Am incercat si mi se pare calea de urmat.

eugen.anghel spunea...

Aș mai adăuga cateva funcționalități pe care le folosesc destul de des:
- Git poate cauta rapid (opțional, dupa un regex) in commit-urile vechi, dupa mesajul de commit sau chiar după conținutul patch-ului. Foarte util dacă vrei sa vezi cănd/de ce/cine a modificat o funcție sau o clasă. Vezi git-log, opțiunile -S, --pickaxe-all și --pickaxe-regex.
- seturi de modificări curente poate fi suspendat într-un "stash" și aplicat ulterior (similar shelving-ului din TFS). Stash-ul poate conține oricâte seturi de modificări iar acestea pot fi aplicate peste orice branch (cu merge, dacă este cazul). Vezi git-stash.
- modificarile curente pot fi împărțite în mai multe commituri, folosind indexul git. Acest feature este *priceless*, doarece îți permite să creezi multe commituri mici, pentru un singur issue. De exemplu: lucrezi la un feature, găsești un bug, îl rezolvi, dai commit doar la bugul respectiv, iar apoi continui lucrul normal. Multe commituri mici și punctuale ușurează enorm atât code review-ul, cât și căutarea prin commituri vechi la nevoie: este mult mai clar de ce s-a făcut o anumită schimbare dacă commitul e mic și mesajul de commit corect. Vezi git-add, opțiunile --interactive și --patch.

Cât despre tools:

Folosesc QGit pentru a vizualiza relațiile dintre mai multe branch-uri (pentru un singur branch git-log e suficient). Merge-urile le fac cu KDiff3 și mi se pare destul de bun. De menționat și scurtăturile excelente (e.g. Ctrl+1, Ctrl+2, Ctrl+3 pentru a alege dintre variante în cazul unui conflict). Singurul issue ar fi fișierele SQL, unde mai bine faci merge de mână.

> Git Extensions e tot ce ai nevoie pentru a rula Git.
In afara cazurilor de mai sus, eu și încă doi colegi folosim doar linia de comanda pentru a lucra cu Git. E mai rapidă și mai puternică decat un GUI în majoritatea cazurilor. Există de asemenea și TortoiseGit, proiect similar TortoiseSvn, care mi s-a părut destul de fain.

Gabriel Enea spunea...

@valentinu
Mi-ar placea sa introduc Git in firma dar ramane de vazut care va fi parerea colegilor dupa ce vor analiza Git (le-am trimis un email cu resurse de informare).

VSS nu stiu daca mai este suportat de Microsoft si cred ca mai bine migrati spre Team Foundation Version Control, trecerea va fi mai usoara, mai ales cu urmatoarea versiune care se anunta usor de instalat si ca va folosi resurse minime.

De ce folosesti dropbox? Ca sa nu utilizezi un repository central? Cat de potrivit e sincronizarea atunci cand lucrezi in echipa?

@eugen
Deoarece stiu ca ai experienta cu Git, ai dori sa tii o prezentare de Git la o intalnire a comunitatii de IT din Iasi (una dintre ele...)?

Multumesc pentru detalii, o parte deja le-am descoperit in timpul de analiza.

eugen.anghel spunea...

> ai dori sa tii o prezentare de Git la o intalnire a comunitatii de IT din Iasi

Nu cred c-as putea face o prezentare mai buna decat cele care sunt deja pe net. Iar dacă are cineva întrebări recomand să le pună pe #git pe freenode (sunt și eu câteodată pe-acolo). Oamenii sunt foarte amabili.