https://eduspaces.ro/s/pro-git/capitol/s-10/
🔩 10. Git Internals
Interiorul lui Git: obiecte, referințe, packfile-uri, refspec, protocoale de transfer și recuperare.
Bază (1)
Aprofundare (11)
Git este în esență un sistem de fișiere adresabil prin conținut — un depozit simplu cheie–valoare: introduci orice conținut și primești o cheie unică (SHA-1) cu care îl regăsești.
Comenzile de nivel jos ale lui Git, făcute pentru a fi înlănțuite în stil UNIX sau apelate din scripturi (de exemplu hash-object, cat-file).
Comenzile Git prietenoase pentru utilizator (commit, checkout, branch etc.), opuse comenzilor plumbing.
Conținutul bazei de date Git, în directorul objects: blob-uri, arbori, commit-uri și etichete, fiecare stocat comprimat (zlib) sub SHA-1-ul conținutului.
Obiectul în care Git stochează conținutul unui fișier (fără numele lui), identificat prin SHA-1-ul conținutului; corespunde aproximativ conținutului unui fișier sau unui inode.
Obiect care listează conținutul unui director: intrări cu mod, tip, nume de fișier și SHA-1-ul unui blob sau al unui subarbore; corespunde intrărilor de director din UNIX.
Obiectul pe care Git îl stochează la un commit: pointer spre arborele rădăcină al snapshot-ului, numele și e-mailul autorului, mesajul și pointeri spre părinte — zero pentru commit-ul inițial, unul pentru un commit normal, mai mulți pentru un merge.
Nume simplu (ref) salvat într-un fișier din .git/refs care conține un SHA-1, ca să nu folosești valoarea brută: ramuri (refs/heads), etichete (refs/tags), remotes (refs/remotes).
Garbage collection: adună obiectele loose în packfile-uri, comasează packfile-urile și referințele (packed-refs) și elimină obiectele vechi neaccesibile; Git o rulează uneori automat („auto gc”).
Fișier binar în care Git împachetează mai multe obiecte pentru a economisi spațiu (când sunt prea multe obiecte loose, la git gc sau la push); versiunile asemănătoare ale unui fișier se păstrează ca delta față de una completă.
Specificația care arată cum se mapează referințele la fetch și push: un + opțional, apoi <src>:<dst> — tiparul referințelor de pe remote și locul unde sunt urmărite local (de exemplu +refs/heads/:refs/remotes/origin/).
Detaliu (9)
Comandă plumbing care inspectează un obiect: -p afișează conținutul, -t tipul obiectului.
Comandă plumbing care calculează cheia unică (SHA-1) a unui conținut; cu -w scrie conținutul în baza de obiecte.
Referință care conține un pointer către altă referință, nu un SHA-1; fișierul HEAD este de obicei o referință simbolică spre ramura curentă.
Al patrulea tip de obiect Git: seamănă cu un commit (autor, dată, mesaj, pointer), dar indică de obicei un commit, nu un arbore; este creat de etichetele anotate.
Diferența stocată într-un packfile între versiunile succesive ale unui fișier, în locul unei copii complete a fiecărei versiuni.
Formatul inițial în care Git salvează obiectele pe disc: câte un fișier comprimat pentru fiecare obiect, nepus încă într-un packfile.
Protocolul de transfer cu un proces Git la ambele capete: la push send-pack (client) cu receive-pack (server), la fetch fetch-pack cu upload-pack, care negociază ce date trebuie trimise.
Recuperarea commit-urilor pierdute (de exemplu după un reset --hard): găsești SHA-1-ul în reflog (git reflog, git log -g) sau cu git fsck și creezi o ramură care să indice spre el.
Verifică integritatea bazei de date; cu --full arată obiectele spre care nu indică nimic („dangling”), utile pentru recuperarea unui commit pierdut.
Niciun concept nu se potrivește filtrului.