Sari la conținut

Git

De la Wikipedia, enciclopedia liberă
Git
Autor inițialLinus Torvalds[1]  Modificați la Wikidata
DezvoltatorLinus Torvalds[2]
Junio Hamano[*]
Software Freedom Conservancy[*][[Software Freedom Conservancy (non-profit organization in the US that provides a non-profit home and infrastructure support, including legal services, for free/open source software projects)|]][3]  Modificați la Wikidata
Versiune inițială[4]
Ultima versiune2.54.0[5][6]  Modificați la Wikidata ()
Repogit.kernel.org/pub/scm/git/git.git Modificați la Wikidata
Scris înC[7][8]
Perl
Tcl/TK
Python
shell script[*][[shell script (limbaj de programare)|]]
Rust[9]  Modificați la Wikidata
Sistem de operareGNU/Linux[10]
BSD[*][10]
Mac operating system
Microsoft Windows[10]
Unix-like
multiplatformă  Modificați la Wikidata
Disponibil înlimba engleză
limba bulgară
limba catalană
limba franceză
indoneziană
limba suedeză
limba turcă
limba ucraineană
limba vietnameză
chineză simplificată[*]  Modificați la Wikidata
LicențăGPLv2[11]  Modificați la Wikidata
Prezență online
site web oficial

Git (/ɡɪt/) este un sistem software⁠(d) de control distribuit al versiunilor⁠(d) [12] capabil să gestioneze versiunile codului sursă sau datelor în general. Este adesea utilizat pentru gestiunea codului sursă de către programatorii care dezvoltă software într-o manieră colaborativă⁠(d).

Printre obiectivele de design ale lui Git se numără viteza, integritatea datelor⁠(d), și suportul pentru fluxuri de lucru distribuite și neliniare⁠(d)—cu mii de ramuri⁠(d) rulând în paralel pe calculatoare diferite.[13][14]

Ca și în cazul celor mai multe sisteme distribuite de control al versiunilor, și spre deosebire de cele mai multe sisteme client–server, Git menține o copie locală a întregului repository, denumit pe scurt „repo”, cu tot cu istoricul și cu toate capabilitățile de urmărire a versiunilor, independent de accesul la rețea sau la un server central. Pe fiecare calculator, repoul se stochează într-un director standard care conține fișiere ascunse⁠(d) suplimentare în care se țin date legate de controlul versiunilor.[15] Git furnizează facilități de sincronizare între repouri care au un istoric comun; pentru colaborarea asincronă, aceasta se extinde la repouri aflate pe alte mașini. Deși toate repourile (care au același istoric) au un statut egal între ele, dezvoltatorii mențin adesea un server central al cărui repo menține o copie integrată.

Git este software liber cu sursă deschisă partajat exclusiv sub licența GPL-2.0.

Git a fost creat de către Linus Torvalds pentru controlul versiunilor în procesul de dezvoltare al kernelului Linux.[16] Marca „Git” este înregistrată de către Software Freedom Conservancy⁠(d).

Astăzi, Git este sistemul de control al versiunilor cel mai utilizat de către dezvoltatorii de software. Este cel mai popular astfel de sistem:[17] în 2022, aproape 95% din dezvoltatori îl declarau ca fiind sistemul principal de control al versiunilor pe care îl foloseau la acea dată.[18] Există și oferte de servicii de întreținere a repourilor Git, între care GitHub, SourceForge, Bitbucket și GitLab⁠(d).[19][20][21][22][23]

Torvalds a început să dezvolte Git în aprilie 2005 după revocarea licenței de BitKeeper⁠(d), un sistem de control al versiunilor (SCM) pe care kernelul Linux îl folosea din 2002.[24][25] Deținătorul drepturilor de autor ale lui BitKeeper, Larry McVoy⁠(d), a susținut că Andrew Tridgell⁠(d) ar fi creat SourcePuller⁠(d) prin inginerie inversă pe baza protocoalelor din BitKeeper.[26] Același incident a dus și la crearea lui Mercurial, un alt sistem de control al versiunilor.

Torvalds dore un sistem distribuit pe care îl dorea folosit la fel ca BitKeeper, dar niciunul din cele disponibile nu îi satisfăcea necesitățile. El a dar ca exemplu faptul că un sistem de gestiune a surselor are nevoie de 30 de secunde pentru a aplica un patch și a actualiza toate metadatele asociate, arătând că asemenea performanță nu scalează la nevoile comunității care dezvoltă kernelul Linux, unde sincronizarea cu alți colegi necesită uneori rularea a până la 250 de astfel de acțiuni simultan. Drept criteriu de design, el a specificat că operațiunea de patch trebuie să nu dureze mai mult de trei secunde, adăugând încă alte trei obiective:[13]

  • Se va lua Concurrent Versions System (CVS) ca exemplu de cum să nu; dacă ai îndoieli, ia decizia exact inversă decât cea luată de dezvoltatorii lui CVS.[27]
  • Suportă un flux de lucru distribuit, în stilul BitKeeper.[27]
  • Include mecanisme foarte puternice de protecție împotriva coruperii, fie malițioase, fie accidentale.[14]

Aceste criterii eliminau toate sistemele de control al versiunilor utilizate la acea dată, așa că, imediat după lanarea versiunii de dezvoltare 2.6.12-rc2 a kernelului de Linux, Torvalds a început lucrul la propriul sistem.[27]

Dezvoltarea lui Git a început pe .[28] Torvalds a anunțat proiectul pe , iar a doua zi era deja self-hosting⁠(d).[28][29] Prima operațiune de merge a mai multor branch-uri a avut loc pe .[30] După doar două săptămâni de lucru, Torvalds își îndeplinise deja obiectivele de performanță; pe , la un test de performanță Git a reușit să aplice patch-uri pe arborele kernelului de Linux într-un ritm de 6,7 patch-uri pe secundă.[31] Pe , Git a fost trecut în producție, la gestionarea release-ului 2.6.12 al kernelului.[32]

Pe , Torvalds a predat activitatea de mentenanță⁠(d) lui Junio Hamano, unul din principalii contribuitori la proiect.[33] Hamano s-a ocupat de release-ul 1.0 care a fost lansat pe .[34]

Despre numele git (care în engleza britanică este un termen argotic pentru o persoană neplăcută sau ridicolă) Torvalds a glumit: „eu sunt un nesuferit egoist, și îmi numesc toate proiectele dypă mine. Întâi «Linux», acum «git».”[35][36] Pagina de manual⁠(d) îl descrie pe Git „trackerul tâmpit de conținut”.[37]

Fișierul read-me al surselor elaborează:[38]

Codul sursă pentru Git îl denumește the information manager from hell.[39][40]

Caracteristici

[modificare | modificare sursă]

Designul lui Git este o sinteză între experiența lui Torvalds cu Linux la întreținerea unui proiect mare, distribuit, și cunoștințele lui detaliate despre performanța sistemelor de fișiere, pe care a dobândit-o din același proiect și din nevoia stringentă de a produce un sistem funcțional într-un tip scurt. Aceste influențe au condus la următoarele decizii de implementare:[16]

Suport puternic pentru dezvoltarea neliniară
Git oferă operațiuni rapide de branch și merge, și include unelte specifice pentru visualizarea și navigarea unui istoric neliniar. În Git, o presupunere centrală este aceea că unei modificări va ajunge să i se facă merge de mai multe ori decât este scrisă, pe măsură ce se răspândește la mai mulți revieweri. În Git, branch-urile sunt foarte mici: un branch este doar o referință la un commit.
Dezvoltare distribuită
Ca și Darcs⁠(d), BitKeeper⁠(d), Mercurial, Bazaar⁠(d), și Monotone⁠(d), Git oferă fiecărui dezvoltator o copie locală a întregului istoric de dezvoltare, iar modificările se copiază de la un astfel de repo la altul. Aceste schimbări se importă ca branch-uri suplimentare de dezvoltare, și li se poate face merge în același fel ca și unui branch dezvoltat local.[41]
Compatibilitate cu sistemele și protocoalele existente
Repourile se pot publica prin Hypertext Transfer Protocol Secure (HTTPS), Hypertext Transfer Protocol (HTTP), File Transfer Protocol (FTP), sau printr-un protocol Git rulat peste o coneziune socket simplă sau peste Secure Shell (ssh). Git are și un emulator de server CVS, care i-a permis utilizarea clienților existenți și a pluginurilor de IDE pentru CVS în vederea accesării repourilor de Git. Repourile de Subversion pot fi folosite direc prin git-svn.[42]
Tratarea eficientă a proiectelor mari
Torvalds l-a descris pe Git drept foarte rapid și scalabil,[43] iar testele de performanță efectuate de Mozilla[44] au arătat că este cu un ordin de mărime mai rapid la compararea unor repouri mari decât Mercurial și GNU Bazaar; aducerea istoricului de versiuni dintr-un repo stocat local poate fi de o sută de ori mai rapidă decât aducerea ei de pe un server diferit.[45]
Autentificare criptografică a istoricului
Istoricul este stocat de Git în așa fel încât ID-ul unei versiuni particulare (un commit în terminologie Git) depinde de istoricul complet de dezvoltare de până la acel commit. Odată publicată, versiunile vechi nu se mai pot schimba fără a fi observate. Structura este similară unui arbore Merkle, dar cu date adăugate la noduri și frunze.[46] (această proprietate o au și Mercurial și Monotone⁠(d).)
Design bazat pe toolkit
Git a fost proiectat ca un set de programe scrise în C și câteva scripturi de shell care oferă wrappere în jurul acestor programe.[47] Deși majoritatea acestor scripturi au fost între timp rescrise în C pentru viteză și portabilitate, designul rămâne, și componentele se pot înlănțui ușor una cu celelalte.[48]
Strategii de merge cuplabile
Ca parte a designului de toolkit, Git are un model bine definit al unui merge incomplet, și are mai mulți algoritmi care îl completează, culminând cu informarea utilizatorului că merge-ul nu poate fi efectuat automat și că este nevoie de editare manuală.[49]
Garbage⁠(d) se acumuleaza până când este strâns
Operațiunile abandonate și schimbările la care s-a renunțat lasă obiecte inutile prin baza de date. Ele sunt în general o mica parte din istoricul de obiecte dorite, în creștere constantă. Git efectuează garbage collection⁠(d) automat când se atinge un prag de obiecte neconectate prin repo. Operațiunea se poate apela și explicit, cu git gc.[50][51]
Împachetarea explicită și periodică a obiectelor
Git stochează fiecare obiect nou-creat într-un fișier separat. Deși sunt comprimate individual, acestea ocupă mult spațiu și sunt ineficiente. Problema este rezolvată prin utilizarea pachetelor care stochează multe obiecte delta-comprimate⁠(d) între ele într-un singur fișier (sau flux de date prin rețea) numit packfile. Pachetele sunt comprimate folosind euristica că fișierele cu același nume sunt probabil similare; această presupunere este utilizată pentru eficiență, nu pentru corectitudine. Pentru fiecare pachet se creează un fișier index corespunzător, unde se consemnează offsetul la care începe fiecare obiect în pachet. Obiectele nou-create (cu istoric recent adăugat) sunt stocate tot ca obiecte individuale, iar reîmpachetarea se face periodic pentru a întreține eficiența utilizării spațiului de stocare. Procesul de împachetare a repoului poate fi foarte costisitor din punct de vedere computațional. Permițând obiectelor să existe în repo într-un format liber dar rapid generat, Git permite amânarea costisitoarei operațiuni de împachetare pentru un moment când durata ei contează mai puțin, cum ar fi la sfârșitul zilei de lucru. Git efectuează automat reîmpachetări, dar este posibilă și declanșarea uneia manuale, cu comanda git gc.[52] Pentru integritatea datelor, atât pachetul cât și indexul mențin în interior o sumă de control SHA-1⁠(d),[53] și numele fișierului pachet conține și el o sumă de control SHA-1. Pentru a verifica integritatea unui repo, se poate rula comanda git fsck.[54][55]

O altă proprietate a lui Git este că înregistrează arbori de directoare de fișiere. Primele sisteme de evidență a versiunilor codului sursă, ca Source Code Control System⁠(d) (SCCS) și Revision Control System (RCS), lucrau cu fișiere individuale și puneau accent pe economia de spațiu care se obține prin deltauri intercalate⁠(d) (SCCS) sau prin codificarea delta⁠(d) (RCS) a versiunilor similare. Sistemele ulterioare au conservat această noțiune că un fișier are o anume identitate prin mai multe versiuni ale unui proiect. Torvalds a respins însă acest concept.[56] Ca urmare, Git nu înregistrează explicit relații la nivel de versiune de fișier la niciun nivel mai jos de cel al arborelui de cod sursă.

Aceste relații implicite au câteva consecințe importante:

  • Este puțin mai costisitoare examinarea istoriei modificărilor unui singur fișier față de cele pe tot proiectul.[57] Pentru a obține un istoric al modificărilor care afectează un fișier dat, Git trebuie să parcurgă istoria globală și să determine pentru fiecare schimbare dacă a modificat sau nu acel fișier. Această metodă de examinare a istoricului îi permite însă lui Git să producă cu eficiență egală un istoric al modificărilor operate pe un set arbitrar de fișiere. De exemplu, un caz comun este un subdirector al arborelui de surse plus un fișier header global asociat.
  • Redenumirile sunt tratate implicit și nu explicit. O nemulțumire comună față de CVS este aceea că folosește numele unui fișier pentru a-i identifica istoricul versiunilor, astfel că mutarea sau schimbarea numelui unui fișier nu este posibilă fără a-i întrerupe istoricul, sau fără redenumirea istoricului, ceea ce face ca istoricul să fie imprecis. Cele mai multe sisteme de control al versiunilor post-CVS rezolvă această problemă atribuind fișierului un nume unic și persistent (similar unui număr de inod⁠(d)) care persistă dincolo de redenumire. Git nu înregistrează un astfel de identificator, declarând aceasta un avantaj.[58][59] Fișierele de cod sursă sunt adesea divizate sau unite, sau doar redenumite,[60] iar înregistrarea acesteia ca o simplă redenumire ar înscrie în istoricul imuabil o descriere inexactă a ceea ce s-a întâmplat. Git tratează problema detectând redenumirile atunci când navighează istoricul de snapshoturi ale arborelui.[61] (Pe scurt, dat fiind un fișier din versiunea N, un fișier cu același nume din versiunea N  1 este strămoșul lui implicit. Atunci când însă nu există un fișier cu același nume în versiunea N  1, Git caută un fișier care a existat doar în versiunea N  1 și este foarte similar cu cel nou.) Aceasta necesită însă sarcini mai intense pe CPU de fiecare dată când se revizuiește istoricul, și sunt disponibile câteva opțiuni de ajustarea euristicii. Acest mecanism nu funcționează mereu; uneori, un fișiere care a fost și modificate și redenumit în același commit este interpretat ca ștergerea fișierului vechi și crearea unuia nou. Dezvoltatorii pot ocoli această limitare punând redenumirea și modificarea în commituri separate.

Strategiile de merge

[modificare | modificare sursă]

Git implementează mai multe strategii de merge; la momentul merge-ului se poate selecta o altă strategie decât cea implicită:[62]

  • resolve: algoritmul tradițional de three-way merge⁠(d).
  • recursiv: Aceasta este strategia implicită la pull sau la merge-ul unui singur branch, și este o variantă a algoritmului three-way.  

    Când sunt mai mulți strămoși comuni ce pot fi folosiți pentru un three-way merge, se creează un arbore unificat al strămoșilor comuni și se folosește acela drept arbore de referință la three-way merge. Aceasta a avut ca rezultat mai puține conflicte de merge fără a cauza merge-uri eșuate. S-a confirmat prin teste efectuate asupra commiturilor de merge anterioare, extrase din istoricul de dezvoltare al kernelului Linux 2.6. Aceasta poate și detecta și trata merge-uri care implică redenumiri.

    Linus Torvalds[63]
  • octopus: Aceasta este strategia implicită atunci când se face merge la mai mult de două ramuri.

Structuri de date

[modificare | modificare sursă]

Tipurile primitive de date ale lui Git nu sunt interent un sistem de gestiune a codului sursă. Torvalds explică:[64]

În multe sensuri, putem privi git ca pe un sistem de fișiere—este adresabil prin conținut⁠(d), și are o noțiune de versionare, dar l-am proiectat de fapt abordând problema din punctul de vedere al unui expert în „sisteme de fișiere” (că eu de kerneluri mă ocup), și nu am absolut niciun interes să creez un sistem tradițional de control al versiunilor.

Din această abordare inițială de proiectare, Git și-a dezvoltat tot setul de funcționalități așteptate de la un sistem de control al versiunilor tradițional,[65] funcționalitățile fiind mai ales create la un nivel limitat, apoi rafinate și extinse în timp.

Unele fluxuri de date și niveluri de stocare în sistemul de control al versiunilor Git

Git are două structuri de date: un index modificabil (numit și stage sau cache) care păstrează temporar informația despre directorul de lucru⁠(d) și următoarea versiune ce va fi commitată; și o bază de date de obiecte care stochează obiecte imuabile.[66]

Indexul servește drept punct de legătură între baza de date de obiecte⁠(d) și arborele de lucru.[66]

În baza de date de obiecte se stochează cinci tipuri de obiecte:[67][54]

  • Un blob este conținutul unui fișier. Bloburile nu au nume de fișier, mărci temporale sau alte metadate (intern, numele unui blob este un hash al conținutului său). În Git, fiecare blob este o versiune a unui fișier, în care se află datele din fișier.[68]
  • Un obiect arbore care este echivalentul unui director. El conține o listă de nume de fișiere,[69] fiecare cu câțiva biți de tip și o referință la obiectul blob sau arbore care este acel fișier, acea legătură simbolică, sau acel conținut de director. Aceste obiecte sunt un snapshot al arborelui de surse. (În ansamblu, aceasta compune un arbore Merkle, ceea ce înseamnă că este nevoie doar de un singur hash al arborelui rădăcină pentru a identifica cu precizie starea exactă a unor întregi structuri arborescente ce conțin oricâte subdirectoare și fișiere.)
  • Un obiect commit leagă împreună obiecte arbore în istoric. El conține numele unui obiect arbore (sau al directorului rădăcină al surselor), o marcă temporală, un mesaj de jurnal, și numele a zero sau mai multe commituri părinte.[70]
  • Un obiect tag este un container ce conține referința la alt obiect și poate ține metadate adăugate despre alt obiect. Cel mai comun, el este folosit pentru a stoca o semnătură digitală a unui obiect commit corespunzător unei anume versiuni a datelor gestionate de Git.[71]
  • Un obiect packfile (pachet) colectează diferite alte obiecte într-o structură unică, comprimată cu zlib⁠(d), pentru a o menține compactă și ușor de transportat peste protocoalele de rețea.[72]

Fiecare obiect este identificat printr-un hash⁠(d) SHA-1 al conținutului său. Git calculează hash-ul și utilizează valoarea lui pentru numele obiectului. Obiectul este pus într-un director care se potrivește cu primele două caractere ale hash-ului său. Restul hash-ului este folosit drept numele de fișier al acelui obiect.

Git stochează fiecare versiune a unui fișier ca un blob unic. Relația dintre bloburi poate fi găsită examinând arborele și obiectele commit. Obiectele nou adăugate sunt stocate în întregime folosind compresia zlib. Aceasta poate consuma rapid cantități mari de spațiu de stocare, așa că fișierele sunt combinate în pachete, care folosesc delta compresia⁠(d) pentru a economisi spațiu, stocând bloburile drept modificări relative la alte bloburi.

Git stochează etichete denumite refuri (prescurtare de la referințe) pentru a indica locațiile diferitelor commituri. Ele sunt stocate în baza de date de referințe și sunt, respectiv:[73]

  • Headuri (branch-uri): Referințe cu nume care sunt schimbate automat la un nou commit atunci când se face un commit peste ele.
  • HEAD: Un anume head rezervat care va fi comparat cu arborele de lucru la crearea unui commit.
  • Taguri: Ca și referințele de tip branch, dar sunt fixate la un anume commit. Se folosesc pentru a eticheta momente importante din istoric.

Printre comenzile frecvent folosite pentru interfața prin linie de comandă a lui git se numără:[74][75]

  • git init, folosit pentru crearea unui repo nou.
  • git clone [URL], care clonează, sau duplică, un repo gitde la un URL extern.
  • git add [fișier], care adaugă un fișier la directorul de lucru (fișierele ce urmează a fi commitate) al lui Git.
  • git commit -m [mesaj], care commitează fișierele din directorul actual de lucru (ca ele să devină parte din istoricul repoului).

Se poate crea un fișier .gitignore ca fișier text. Fișierele listate în .gitignore nu vor fi urmărite de Git.[76](pp3–4) Această funcționalitate poate fi folosită pentru a ignora fișiere cu chei sau parole, diferite alte fișiere temporare, precum și fișierele foarte mari (pe care unele servicii de repo Git refuză să le primească la upload).[77]

Referințe Git

[modificare | modificare sursă]

Fiecare obiect din baza de date Git care nu este referit poate fi curățat automat sau prin folosirea unei comenzi de garbage collection. Un obiect poate fi referențiat de alt obiect sau de o referință explicită. Git are diferite tipuri de referințe. Comenzile pentru crearea, mutarea și ștergerea referințelor pot varia. git show-ref listează toate referințele. Unele tipuri sunt:

  • head: se referă la un obiect local,
  • remote: se referă la un obiect care există într-un repo diferit,
  • stash: se referă la un obiect necommitat încă,
  • meta: de exemplu, o configurare într-un repo simplu, drepturi de utilizator; spațiul de nume refs/meta/config a fost introdus retrospectiv,[78]
  • tag: vezi mai sus.

Implementări

[modificare | modificare sursă]
gitg este un front-end grafic ce folosește GTK+.

Git (principala implementare în C) este dezvoltată în principal pe Linux, dar suportă și alte sisteme majore de operare, inclusiv familia BSD (DragonFly BSD, FreeBSD, NetBSD, și OpenBSD), Solaris, macOS, și Windows.[79][80]

Prima portare⁠(d) a lui Git pe Windows era în principal un framework de emulare de Linux pe care rula versiunea de Linux. Instalarea lui Git sub Windows creează un director cu nume similar în Program Files, conținând portarea pe Mingw-w64⁠(d) a lui GNU Compiler Collection, Perl 5, MSYS2⁠(d) (el însuși un fork de Cygwin⁠(d), un mediu de emulare Unix-like pentru Windows) și diferite alte portări pe Windows sau emulări ale unor utilitare și biblioteci de Linux. Actualmente, se distribuie builduri native de Git pe Windows ca installer pe 32 sau 64 de biți.[81] Website-ul oficial Git întreține un build de Git pentru Windows, tot cu mediul MSYS2.[82]

Implementarea JGit este o bibliotecă software pentru Java⁠(d), proiectată pentru a fi înglobată în orice aplicație Java. JGit este utilizată în unealta de code review Gerrit, și în EGit, un client de Git pentru IDE-ul Eclipse.[83]

Go-git este o implementare open-source de Git scrisă în Go.[84] Ea este folosită actualmente pentru sprijinirea unor proiecte ca interfață SQL pentru repouri de cod Git[85] și pentru furnizarea de criptare pentru Git.[86]

Dulwich este o implementare de Git scrisă în Python cu suport pentru CPython 3.6 și versiunile ulterioare, precum și pentru Pypy.[87]

Implementarea libgit2 este o bibliotecă de software ANSI C fără dependențe, care poate fi compilată pe multiple platforme, inclusiv Windows, Linux, macOS, și BSD.[88] Are bindinguri pentru multe limbaje de programare, inclusiv Ruby, Python, și Haskell.[89][90][91]

Alte implementări de Git sunt JS-Git (o implementare în JavaScript a unui subset al lui Git),[92] Game of Trees (o implementare open-source de Git pentru proiectul OpenBSD),[93] git9 (o implementare independentă de Git pentru Plan 9⁠(d) utilizând abstracții native de sistem),[94][95] și gitoxide (o implementare de Git scrisă în Rust).[96]

Captură de ecran a interfeței gitweb care prezintă un diff⁠(d) de commit

Întrucât Git este un sistem distribuit de control al versiunilor, el poate fi folosit și direct ca server. El vine cu o comandă git daemon care pornește un server TCP simplu care rulează pe protocolul Git.[97][98] Serverele HTTP dedicate lui Git ajută (printre altele) la adăugarea controlului accesului, afișarea conținutului unui repo Git prin interfețele web, și gestionarea mai multor repouri. Repourile Git deja existente pot fi clonate și partajate pentru a fi utilizate ca repo centralizat. El poate fi și accesat prin shell la distanță doar prin instalarea software-ului Git și permiterea utilizatorilor să se autentifice.[99] Serverele Git ascultă de regulă pe portul TCP 9418.[100]

Pentru navigarea repourilor de pe web, Git vine și cu gitweb, o interfață bazată pe CGI pentru vizualizarea conținuturilor repourilor peste HTTP.[101]

  • Rularea unui Git server folosind Git Binary.[102]
  • Gerrit, un server de Git configurabil care oferă suport pentru code review-uri și furnizează acces prin ssh, un Apache MINA⁠(d) integrat, sau OpenSSH, sau un server web Jetty⁠(d) integrat. Gerrit oferă integrare pentru LDAP, Active Directory, OpenID, OAuth, Kerberos/GSSAPI, certificate X509 de client HTTPS. Cu Gerrit 3.0, toate configurațiile se stochează ca repouri Git, și nu este necesară nicio bază de date pentru a-l rula. Gerrit poate trata pull-requesturi printr-o funcționalitate implementată în core, dar nu are un GUI pentru ea.
  • Phabricator⁠(d), un spin-off din Facebook. Cum Facebook rulează în principal Mercurial, suportul pentru Git nu este foarte important.[103]
  • RhodeCode⁠(d) Community Edition (CE) suportă Git, Mercurial și Subversion sub o licență AGPLv3 license⁠(d).
  • Kallithea⁠(d) suportă Git și Mercurial, este dezvoltat în Python cu licență GPL.
  • Proiecte externe ca gitolite,[104] care oferă scripturi peste software-ul Git pentru control fin al accesului.
  • Există mai multe soluții libere pentru găzduire, între care Gogs,[105] Gitea⁠(d), un fork al lui Gogs, precum și Forgejo⁠(d), care este, la rândul lui, un fork de Gitea. Gogs și derivatele lui sunt dezvoltate în Go. Toate cele trei soluții sunt disponibile sub licența MIT⁠(d).

Interfețe grafice

[modificare | modificare sursă]

Clienții Git GUI oferă o interfață grafică pentru utilizatori pentru a simplifica interacțiunea cu repourile Git.

Aceste GUI-uri furnizează reprezentări vizuale ale istoricului proiectului, inclusiv branch-uri, commituri și modificări pe fișiere. Ele simplifică acțiuni ca indexarea unor modificări, crearea de commituri și gestiunea branch-urilor. Uneltele vizuale de diff ajută la rezolvarea conflictelor de merge ce rezultă din dezvoltări concurente.

Git vine cu un GUI în Tcl/Tk⁠(d), care permite utilizatorilor să efectueze acțiuni ca crearea și modificarea commiturilor, crearea și merge-ul branch-urilor, și interacțiunea cu repouri de la distanță.[106]

Pe lângă interfața grafică oficială, există multe alte interfețe create de terți, care oferă funcționalități similare celei oficiale distribuite cu Git.[107]

Clienții GUI fac Git să fie mai ușor de învățat și folosit, îmbunătățind eficiența fluxului de lucru și reducând erorile.

Fundația Eclipse⁠(d) raporta în mai 2014 că Git este cea mai folosită unealtă de management al codului sursă, 42,9% din dezvoltatorii profesioniști declarând că Git este sistemul lor principal de control al surselor,[108] o creștere față de 36,3% în 2013 și 32% în 2012; și excluzând utilizarea GitHub: 33,3% în 2014, 30,3% în 2013, 27,6% în 2012 și 12,8% în 2011.[109] Registrul open-source Open Hub⁠(d) raportează o creștere similară în rândul proiectelor open-source.[110]

Stack Overflow a inclus controlul versiunilor în sondajul pe care îl organizează anual în rândul dezvoltatorilor[111] în 2015 (16.694 de răspunsuri),[112] 2017 (30.730 de răspunsuri),[113] 2018 (74.298 de răspunsuri)[114] și 2022 (71.379 de răspunsuri).[18] Git a fost favoritul dezvoltatorilor care au răspuns în toate aceste ediții, cu cifre ca 93,9% în 2022.

Sistemele de control al versiunilor utilizate de respondenți:

Name 2015 2017 2018 2022
Git 69.3% 69.2% 87.2% 93.9%
Subversion 36.9% 9.1% 16.1% 5.2%
TFVC⁠(d) 12.2% 7.3% 10.9% [i]
Mercurial 7.9% 1.9% 3.6% 1.1%
CVS 4.2% [i] [i] [i]
Perforce⁠(d) 3.3% [i] [i] [i]
VSS⁠(d) [i] 0.6% [i] [i]
IBM DevOps Code ClearCase⁠(d) [i] 0.4% [i] [i]
Backup de zipuri [i] 2.0% 7.9% [i]
Share în rețea [i] 1.7% 7.9% [i]
Altele 5.8% 3.0% [i] [i]
Niciunul 9.3% 4.8% 4.8% 4.3%

Site-ul web itjobswatch.co.uk de joburi în IT în Regatul Unit raporta în septembrie 2016 că 29,27% din anunțurile de joburi permanente în industria software britanică cereau Git,[115] mai mult decât 12,17% pentru Microsoft Team Foundation Server⁠(d),[116] 10,60% Subversion,[117] 1,30% Mercurial,[118] și 0,48% Visual SourceSafe⁠(d).[119]

Există multe extensii de Git, cum ar fi Git LFS, care a început în comunitatea GitHub și este acum foarte folosit de alte repouri. Extensiile sunt de obicei dezvoltate independent și întreținute de persoane diferite, dar o extensie foarte folosită poate fi la un moment dat adusă în interiorul lui Git.

Printre extensiile de Git open-source se numără:

  • git-annex⁠(d), un sistem distribuit de sincronizare a fișierelor bazat pe Git
  • git-flow, un set de extensii Git care oferă operațiuni de nivel înalt pe repouri pentru modelul de branching al lui Vincent Driessen
  • git-machete, un organizator de repouri, unealtă pentru automatizarea operațiunilor de rebase/merge/pull/push

Microsoft a dezvoltat extensia Virtual File System for Git⁠(d) (VFS for Git; fost Git Virtual File System sau GVFS) pentru a trata dimensiunea arborelui de cod sursă al lui Windows în contextul migrării lor în 2017 la Perforce⁠(d). VFS for Git permite care repourile clonate să folosească placeholdere în care conținutul este descărcat doar după ce se accesează un fișier.[120]

Git poate fi folosit într-o multitudine de moduri diferite, dar sunt adoptate unele convenții frecvente.

  • Comanda de creare a unui repo local, git init, creează un branch numit master.[68][121] Adesea, el este utilizat ca branch de integrare în care se aduc modificările făcute în cod.[122] Unele unelte, ca GitHub[123] și GitLab,[124] au ales ca nume implicit main; Git folosește și el main începând cu release-ul 3.0, care va fi lansat la sfârșitul lui 2026.[125] Întrucât remote-ul implicit se numește origin,[126] branch-ul implicit din remote-ul implicit este origin/master. Utilizatorii pot adăuga sau șterge branch-uri și pot alege orice branch pentru integrare.
  • Commiturile cărora li s-a făcut push într-un remote nu se mai suprascriu, ele pot fi anulate doar prin revert,[127] un commit suplimentar care anulează schimbările făcute în cel inițial. Aceasta împiedică invalidarea unor commituri deja distribuite din cauza dispariției commitului pe care se bazează. Dacă commiturile conțin informații sensibile, ele trebuie însă înlăturate, ceea ce implică o procedură mai complexă de rescriere a istoricului.
  • Se adoptă adesea workflow-ul git-flow[128] și convențiile de denumire pentru a face distincția între istoricuri instabile dedicate unei singure funcționalități (feature/*), istoricurile instabile partajate (develop), istoricurile gata de producție (main), și patch-urile de urgență pe produse lansate (hotfix).
  • Un pull request, sau merge request, este o cerere a unui utilizator de a se face merge unui branch în alt branch.[129][130] Git nu oferă funcționalitate de pull request, dar aceasta este una comună pentru serviciile de cloud cu git. Funcționalitatea pe care se bazează un pull request este în esență faptul că un administrator al unui repo face pull la modificările dintr-un alt remote (repoul sursă al pull requestului). pull requestul este însă un tichet gestionat de serverul de hosting, unde se desfășoară aceste acțiuni, nu o funcționalitate a sistemului Git.

Git nu oferă mecanisme de control al accesului, dar a fost gândit pentru a opera cu alte unelte specializate în controlul accesului.[131]

În decembrie 2014, s-a găsit un exploit care afecta versiunile de Windows și macOS ale clientului de Git. Un atacator putea efectua execuții de cod arbitrar⁠(d) pe un calculator țintă care are instalat Git prin crearea unui arbore Git malițios denumit .git (un director în repourile Git unde se stochează toate datele repoului) cu unele litere mari (cum ar fi .GIT sau .Git, deoarece Git nu permite ca versiunea lui .git cu litere mici să fie creată manual) conținând fișiere malițioase în subdirectorul .git/hooks (un director în care rulează fișierele executabile pe care le execută Git) pe un repo creat de atacator sau într-unul pe care atacatorul îl poate modifica. Dacă un user de Windows sau Mac face pull (descarcă) la o versiune a repoului cu directorul malițios, apoi comută la acel director, directorul .git va fi suprascris (din cauză că sistemele de fișiere Windows și Mac sunt case-insensitive) și s-ar putea rula executabilele malițioase din .git/hooks, adică comenzile scrise de atacator. Un atacator ar putea astfel modifica și fișierul de configurație .git/config, care i-ar permite să creeze aliasuri de comenzi Git malițioase sau să modifice aliasuri existente pentru a executa comenzi malițioase la rulare. Vulnerabilitatea a fost reparată în versiunea 2.2.1 de Git, lansată chiar în aceeași zi și anunțată a doua zi.[132][133]

Git versiunea 2.6.1, din septembrie 2015, conține un patch pentru o vulnerabilitate de securitate (CVE-2015-7545)[134] ce permitea execuția de cod arbitrar.[135] Ea putea fi exploatată dacă un atacator convingea o victimă să cloneze un anume URL având comenzile arbitrare în el.[136] Un atacator putea folosi exploitul printr-un atac man-in-the-middle⁠(d) pe o conexiune necriptată,[136] întrucât puteau redirecta utilizatorul la un URL ales de ei. Erau vulnerabile și clonele recursive, întrucât puteau permite controllerului unui repo să specifice URL-uri arbitrare prin fișierul gitmodules.[136]

Git utilizează intern hash-uri SHA-1⁠(d). Linus Torvalds a răspuns că acest hash are în principal rolul de a păzi împotriva coruperii accidentale a datelor, și că utilizarea unui hash criptografic⁠(d) dă un spor de securitate doar ca efect secundar, principala metodă de securitate fiind semnarea.[137][138] De la demonstrarea unui atac SHAttered împotriva lui Git în 2017, Git a fost modificat să folosească o versiune de SHA-1 rezistentă la acest atac. Există un plan de tranziție la alte funcții hash, întocmit din februarie 2020.[139]

Marca înregistrată

[modificare | modificare sursă]

„Git” este cuvânt-marcă înregistrată de Software Freedom Conservancy⁠(d), înregistrat la United States Patent and Trademark Office⁠(d) cu numărul 4680534 din 2015-02-03.

Note de completare

[modificare | modificare sursă]
  1. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Nelistat ca opțiune în acest sondaj

Note bibliografice

[modificare | modificare sursă]
  1. , arhivat din original|archive-url= necesită |url= (ajutor) la |archive-url= necesită |archive-date= (ajutor) Lipsește sau este vid: |title= (ajutor)
  2. https://www.linux.com/blog/10-years-git-interview-git-creator-linus-torvalds. Accesat în . Lipsește sau este vid: |title= (ajutor)
  3. https://github.com/git/git/graphs/contributors. Accesat în . Lipsește sau este vid: |title= (ajutor)
  4. https://marc.info/?l=git&m=117254154130732. Lipsește sau este vid: |title= (ajutor)
  5. Junio Hamano (). [ANNOUNCE] Git v2.54.0” (în engleză). Accesat în .
  6. Taylor Blau (). „Highlights from Git 2.54” (în engleză). Accesat în .
  7. „Git”. Open Hub[*]. Wikidata Q124688. Accesat în .
  8. . https://github.com/EvanLi/Github-Ranking/blob/master/Data/github-ranking-2025-07-06.csv. Lipsește sau este vid: |title= (ajutor)
  9. „Highlights from Git 2.52”. . Accesat în .
  10. 1 2 3 „Git”. Free Software Directory[*]. Wikidata Q2470288. Accesat în .
  11. „Copying” (în engleză). Accesat în .
  12. Chacon & Straub 2014, pp. 29-31.
  13. 1 2 Torvalds, Linus (). „Re: Kernel SCM saga..”. linux-kernel (Mailing list). Arhivat din original la . Accesat în .
  14. 1 2 Torvalds, Linus (). „Re: fatal: serious inflate inconsistency”. git (Mailing list). Arhivat din original la . Accesat în .
  15. Chacon, Scott (). Pro Git (ed. 2nd). New York, NY: Apress⁠(d). pp. 29–30. ISBN 978-1-4842-0077-3.
  16. 1 2 „A Short History of Git”. Pro Git (ed. 2nd). Apress. . Accesat în .
  17. Shirey, Russell G. (). „Git as an Encrypted Distributed Version Control System” (PDF). Defense Technical Information Center⁠(d). p. 38. Accesat în .
  18. 1 2 „Stack Overflow Developer Survey 2022”. Stack Overflow (în engleză). Arhivat din original la . Accesat în .
  19. Krill, Paul (). „Enterprise repo wars: GitHub vs. GitLab vs. Bitbucket”. InfoWorld. Arhivat din original la . Accesat în .
  20. „github.com Competitive Analysis, Marketing Mix and Traffic”. Alexa. Arhivat din original la . Accesat în .
  21. „sourceforge.net Competitive Analysis, Marketing Mix and Traffic”. Alexa. Arhivat din original la . Accesat în .
  22. „bitbucket.org Competitive Analysis, Marketing Mix and Traffic”. Alexa. Arhivat din original la . Accesat în .
  23. „gitlab.com Competitive Analysis, Marketing Mix and Traffic”. Alexa. Arhivat din original la . Accesat în .
  24. Brown, Zack (). „A Git Origin Story”. Linux Journal. Linux Journal. Arhivat din original la . Accesat în .
  25. „BitKeeper and Linux: The end of the road?”. Linux.com (în engleză). . Accesat în .
  26. McAllister, Neil (). „Linus Torvalds' BitKeeper blunder”. InfoWorld. Arhivat din original la . Accesat în .
  27. 1 2 3 .
  28. 1 2 Torvalds, Linus (). „Re: Trivia: When did git self-host?”. git (Mailing list). Arhivat din original la . Accesat în .
  29. Torvalds, Linus (). „Kernel SCM saga.”. linux-kernel (Mailing list). Arhivat din original la . Accesat în .
  30. Torvalds, Linus (). „First ever real kernel git merge!”. git (Mailing list). Arhivat din original la . Accesat în .
  31. Mackall, Matt (). „Mercurial 0.4b vs git patchbomb benchmark”. git (Mailing list). Arhivat din original la . Accesat în .
  32. Torvalds, Linus (). „Linux 2.6.12”. git-commits-head (Mailing list).
  33. Torvalds, Linus (). „Meet the new maintainer.”. git (Mailing list). Arhivat din original la . Accesat în .
  34. Hamano, Junio C. (). „Announce: Git 1.0.0”. git (Mailing list). Arhivat din original la . Accesat în .
  35. „GitFaq: Why the 'Git' name?”. Git.or.cz. Arhivat din original la . Accesat în .
  36. „After controversy, Torvalds begins work on 'git'. PC World. . Arhivat din original la . Torvalds seemed aware that his decision to drop BitKeeper would also be controversial. When asked why he called the new software, 'git', British slang meaning 'a rotten person', he said. 'I'm an egotistical bastard, so I name all my projects after myself. First Linux, now git.'
  37. „git(1) Manual Page”. Arhivat din original la . Accesat în .
  38. „Initial revision of 'git', the information manager from hell · git/git@e83c516”. GitHub. Arhivat din original la . Accesat în .
  39. „git/usage.c at master · git/git”. GitHub (în engleză). Arhivat din original la . Accesat în .
  40. Torvalds, Linus (). „Initial revision of "git", the information manager from hell · git/git@e83c516”. GitHub (în engleză). Arhivat din original la . Accesat în .
  41. „Git – Distributed Workflows”. Git. Arhivat din original la . Accesat în .
  42. Gunjal, Siddhesh (). „What is Version Control Tool? Explore Git and GitHub”. Medium (în engleză). Arhivat din original la . Accesat în .
  43. Torvalds, Linus (). „Re: VCS comparison table”. git (Mailing list). Arhivat din original la . Accesat în .
  44. Jst's Blog on Mozillazine „bzr/hg/git performance”. Arhivat din original la . Accesat în .
  45. Dreier, Roland (). „Oh what a relief it is”. Arhivat din original la .
  46. „Trust”. Git Concepts. Git User's Manual. . Arhivat din original la .
  47. Torvalds, Linus. „Re: VCS comparison table”. git (Mailing list). Arhivat din original la . Accesat în .
  48. iabervon (). „Git rocks!”. Arhivat din original la .
  49. „Git – Git SCM Wiki”. git.wiki.kernel.org. Arhivat din original la . Accesat în .
  50. Chacon & Straub 2014.
  51. „Git User's Manual”. . Arhivat din original la .
  52. Chacon & Straub 2014, p. 499.
  53. Chacon & Straub 2014, pp. 33-34.
  54. 1 2 „Git – Packfiles”. Git. Arhivat din original la . Accesat în .
  55. Chacon & Straub 2014, p. 568.
  56. Torvalds, Linus (). „Re: more git updates.”. linux-kernel (Mailing list). Arhivat din original la . Accesat în .
  57. Haible, Bruno (). „how to speed up 'git log'?”. git (Mailing list). Arhivat din original la . Accesat în .
  58. Torvalds, Linus (). „Re: impure renames / history tracking”. git (Mailing list). Arhivat din original la . Accesat în .
  59. Hamano, Junio C. (). „Re: Errors GITtifying GCC and Binutils”. git (Mailing list). Arhivat din original la . Accesat în .
  60. Hamano, Junio C. (). „Re: Errors GITtifying GCC and Binutils”. git (Mailing list). Arhivat din original la . Accesat în .
  61. Torvalds, Linus (). „Re: git and bzr”. git (Mailing list). Arhivat din original la . Accesat în .
  62. Torvalds, Linus (). „git-merge(1)”. Arhivat din original la .
  63. Torvalds, Linus (18 July 2007).
  64. Torvalds, Linus (). „Re: more git updates..”. linux-kernel (Mailing list). Arhivat din original la . Accesat în .
  65. Torvalds, Linus (). „Re: Errors GITtifying GCC and Binutils”. git (Mailing list). Arhivat din original la . Accesat în .
  66. 1 2 „Git - Git Objects”. git-scm.com. Accesat în .
  67. „Git – Git Objects”. Git. Arhivat din original la . Accesat în .
  68. 1 2 Chacon & Straub 2014, pp. 81-83.
  69. Chacon & Straub 2014, pp. 485-488.
  70. Chacon & Straub 2014, pp. 488-490.
  71. Chacon & Straub 2014, pp. 495-496.
  72. Chacon & Straub 2014, pp. 497-501.
  73. „Git – Git References”. Git. Arhivat din original la . Accesat în .
  74. „Git Cheat Sheet” (PDF). education.github.com. Arhivat din original (PDF) la . Accesat în .
  75. „Git Tutorial” (PDF). web.stanford.edu. Arhivat din original (PDF) la . Accesat în .
  76. „Git Quick Intro” (PDF). data-skills.github.io. Arhivat din original (PDF) la . Accesat în .
  77. Ba Tran, Andrew. „Best practices for uploading to GitHub” (PDF). journalismcourses.org. Arhivat din original (PDF) la . Accesat în .
  78. „Project Configuration File Format”. Gerrit Code Review. Arhivat din original la . Accesat în .
  79. „downloads”. Arhivat din original la . Accesat în .
  80. „git package versions – Repology”. Arhivat din original la . Accesat în .
  81. „msysGit”. GitHub. Arhivat din original la . Accesat în .
  82. „Git – Downloading Package”. Git. Arhivat din original la . Accesat în .
  83. „JGit”. Arhivat din original la . Accesat în .
  84. „Git – go-git”. Git. Arhivat din original la . Accesat în .
  85. „SQL interface to Git repositories, written in Go.”, github.com, arhivat din original la , accesat în
  86. „Keybase launches encrypted git”. keybase.io. Arhivat din original la . Accesat în .
  87. „Dulwich GitHub Repository README.md”. GitHub. Arhivat din original la . Accesat în .
  88. „libgit2”. GitHub. Arhivat din original la . Accesat în .
  89. „rugged”. GitHub. Arhivat din original la . Accesat în .
  90. „pygit2”. GitHub. Arhivat din original la . Accesat în .
  91. „hlibgit2”. Arhivat din original la . Accesat în .
  92. „js-git: a JavaScript implementation of Git”. GitHub. Arhivat din original la . Accesat în .
  93. „Game of Trees”. gameoftrees.org. Arhivat din original la . Accesat în .
  94. „git webls”. orib.dev. Arhivat din original la . Accesat în .
  95. „selfhosting git9”. orib.dev. Arhivat din original la . Accesat în .
  96. „gitoxide: a Rust implementation of Git”. GitHub. Accesat în .
  97. Chacon & Straub 2014, pp. 138-139.
  98. „Git – Git Daemon”. Git. Arhivat din original la . Accesat în .
  99. 4.4 Git on the Server – Setting Up the Server Arhivat în , la Wayback Machine., Pro Git.
  100. „1.4 Getting Started – Installing Git”. Git. Arhivat din original la . Accesat în .
  101. „Git - gitweb Documentation”. git-scm.com. Accesat în .
  102. Chacon, Scott; Straub, Ben (). „Git on the Server – Setting Up the Server”. Pro Git (ed. 2nd). Apress. ISBN 978-1484200773. Accesat în .
  103. Diffusion User Guide: Repository Hosting Arhivat în , la Wayback Machine..
  104. „Gitolite: Hosting Git Repositories”. Arhivat din original la . Accesat în .
  105. „Gogs: A painless self-hosted Git service”. Arhivat din original la . Accesat în .
  106. „Git - git-gui Documentation”. Git (în engleză). Arhivat din original la . Accesat în .
  107. „Git - GUI Clients”. Git (în engleză). Arhivat din original la . Accesat în .
  108. „Eclipse Community Survey 2014 results | Ian Skerrett”. Ianskerrett.wordpress.com. . Arhivat din original la . Accesat în .
  109. „Results of Eclipse Community Survey 2012”. eclipse.org. Arhivat din original la .
  110. „Compare Repositories – Open Hub”. Arhivat din original la .
  111. „Stack Overflow Annual Developer Survey”. Stack Exchange, Inc. Accesat în . Stack Overflow's annual Developer Survey is the largest and most comprehensive survey of people who code around the world. Each year, we field a survey covering everything from developers' favorite technologies to their job preferences. This year marks the ninth year we've published our annual Developer Survey results, and nearly 90,000 developers took the 20-minute survey earlier this year.
  112. „Stack Overflow Developer Survey 2015”. Stack Overflow. Arhivat din original la . Accesat în .
  113. „Stack Overflow Developer Survey 2017”. Stack Overflow. Arhivat din original la . Accesat în .
  114. „Stack Overflow Developer Survey 2018”. Stack Overflow. Arhivat din original la . Accesat în .
  115. „Git (software) Jobs, Average Salary for Git Distributed Version Control System Skills”. Itjobswatch.co.uk. Arhivat din original la . Accesat în .
  116. „Team Foundation Server Jobs, Average Salary for Microsoft Team Foundation Server (TFS) Skills”. Itjobswatch.co.uk. Arhivat din original la . Accesat în .
  117. „Subversion Jobs, Average Salary for Apache Subversion (SVN) Skills”. Itjobswatch.co.uk. Arhivat din original la . Accesat în .
  118. „Mercurial Jobs, Average Salary for Mercurial Skills”. Itjobswatch.co.uk. Arhivat din original la . Accesat în .
  119. „VSS/SourceSafe Jobs, Average Salary for Microsoft Visual SourceSafe (VSS) Skills”. Itjobswatch.co.uk. Arhivat din original la . Accesat în .
  120. „Windows switch to Git almost complete: 8,500 commits and 1,760 builds each day”. Ars Technica. . Arhivat din original la . Accesat în .
  121. „git-init”. Git. Arhivat din original la .
  122. „Git – Branches in a Nutshell”. Git. Arhivat din original la . Accesat în . The "master" branch in Git is not a special branch. It is exactly like any other branch. The only reason nearly every repository has one is that the git init command creates it by default and most people don't bother to change it.
  123. github/renaming, GitHub, , arhivat din original la , accesat în
  124. Default branch name for new repositories now main, GitLab, , arhivat din original la , accesat în
  125. „Git 2.52 Released With More Preparations Toward Git 3.0”. www.phoronix.com (în engleză). Accesat în .
  126. Chacon & Straub 2014, pp. 103-109.
  127. „Git Revert | Atlassian Git Tutorial”. Atlassian (în engleză). Arhivat din original la . Accesat în . Reverting has two important advantages over resetting. First, it doesn't change the project history, which makes it a "safe" operation for commits that have already been published to a shared repository.
  128. „Gitflow Workflow | Atlassian Git Tutorial”. Atlassian (în engleză). Accesat în .
  129. Chacon & Straub 2014, pp. 170–174.
  130. „Forking Workflow | Atlassian Git Tutorial”. Atlassian (în engleză). Arhivat din original la . Accesat în .
  131. „Git repository access control”. Arhivat din original la . Accesat în .
  132. Pettersen, Tim (). „Securing your Git server against CVE-2014-9390”. Arhivat din original la . Accesat în .
  133. Hamano, J. C. (). [Announce] Git v2.2.1 (and updates to older maintenance tracks)”. Arhivat din original la . Accesat în . Parametru necunoscut |newsgroup= ignorat (ajutor)
  134. „CVE-2015-7545”. . Arhivat din original la . Accesat în .
  135. „Git 2.6.1”. GitHub. . Arhivat din original la . Accesat în .
  136. 1 2 3 Blake Burkhart (). „Re: CVE Request: git”. Arhivat din original la . Accesat în .
  137. „hash – How safe are signed git tags? Only as safe as SHA-1 or somehow safer?”. Information Security Stack Exchange. . Arhivat din original la .
  138. „Why does Git use a cryptographic hash function?”. Stack Overflow. . Arhivat din original la .
  139. „Git – hash-function-transition Documentation”. Git.