Inside Git: Oggetti e Hashing
Git è veloce e affidabile grazie al modo in cui memorizza i dati. Per padroneggiare Git, devi comprendere la directory .git. Questa cartella nascosta contiene tutto ciò di cui Git ha bisogno per tracciare il tuo progetto.
Git utilizza quattro tipi principali di oggetti per gestire il tuo lavoro:
- Blobs: memorizzano il contenuto dei file.
- Trees: memorizzano le strutture delle directory e i nomi dei file.
- Commits: memorizzano gli snapshot del tuo progetto e i metadati.
- Tags: memorizzano riferimenti a versioni specifiche.
Git identifica tutto tramite l'hashing. Utilizza l'algoritmo SHA-1 per trasformare i dati in un ID univoco. Questo ID funge da impronta digitale. Se modifichi anche un solo carattere in un file, l'hash cambia completamente.
Come Git crea uno snapshot:
Quando effettui il commit di un file, Git crea una catena di oggetti.
- Il Blob memorizza il testo o i dati effettivi nel tuo file.
- Il Tree associa quel blob a un nome file e a un percorso di cartella specifici.
- Il Commit collega il tree a un autore, a un timestamp e a un messaggio.
Git non memorizza le modifiche o i "delta". Memorizza snapshot. Ogni volta che effettui un commit, Git crea nuovi oggetti. Questo rende la tua cronologia immutabile e facile da recuperare.
Comprendere questa struttura ti aiuta a correggere errori, recuperare dati persi e gestire branch complessi.
Prova questo mini progetto per vederlo in azione:
- Inizializza un repo:
mkdir git-lab
cd git-lab
git init
- Crea un file e trova il suo hash:
echo 'Hello Git' > hello.txt
git hash-object hello.txt
- Memorizza il file come blob:
git hash-object -w hello.txt
- Controlla il tipo di oggetto e il contenuto:
git cat-file -t [YOUR_HASH]
git cat-file -p [YOUR_HASH]
- Crea un commit e visualizza il tree:
git add hello.txt
git commit -m 'Initial commit'
git ls-tree HEAD
Guardando sotto il cofano, vedrai che Git è molto più di un semplice strumento di controllo di versione. È un database altamente organizzato di oggetti indirizzati tramite contenuto (content-addressed objects).
Fonte: https://dev.to/lotanna_obianefo/inside-git-objects-hashing-44gc
Community di apprendimento opzionale: https://t.me/GyaanSetuAi
