Da Anonimo (non verificato) , 29 Aprile 2026

Introduzione

Git è diviso in due strati. I comandi plumbing sono mattoni di basso livello che operano sul database degli oggetti, sui ref e sull'index. I comandi porcelain sono wrapper amichevoli costruiti dal plumbing. git commit è porcelain; git hash-object, git write-tree e git update-ref sono plumbing.

Da Anonimo (non verificato) , 29 Aprile 2026

Introduzione

Il garbage collection (gc) mantiene il tuo repository compatto e veloce. Git lo esegue automaticamente quando certe soglie vengono superate. Puoi anche invocarlo manualmente.

Da Anonimo (non verificato) , 29 Aprile 2026

Introduzione

Un clone shallow scarica solo i più recenti N commit di un branch invece della storia completa. Il risultato è molto più piccolo e veloce da scaricare, al costo di una storia incompleta.

Creare

git clone --depth 1 https://github.com/example/widget.git
git clone --depth 50 https://github.com/example/widget.git
git clone --depth 1 --branch v1.2.3 --single-branch <url>

La directory .git contiene un file shallow che elenca i commit i cui parent sono stati omessi.

Da Anonimo (non verificato) , 29 Aprile 2026

Introduzione

Autenticarsi a un remote Git è perlopiù invisibile finché qualcosa non va storto. I due meccanismi principali sono chiavi SSH e credenziali HTTPS (password o, più comunemente oggi, personal access token).

Chiavi SSH

Genera una chiave moderna:

Da Anonimo (non verificato) , 29 Aprile 2026

Introduzione

Git può trasportare dati su quattro famiglie di protocolli. Ognuna ha compromessi diversi in performance, autenticazione e amichevolezza con i firewall.

Locale / file

Clonare da una directory usa I/O di file locali. Due forme di URL:

git clone /srv/git/widget.git
git clone file:///srv/git/widget.git

La prima forma può usare hardlink per gli oggetti quando sullo stesso filesystem (molto veloce, molto efficiente in spazio). La forma file:// copia sempre via il protocollo smart.

Da Anonimo (non verificato) , 29 Aprile 2026

Introduzione

Tutto ciò che Git sa su un repository vive in .git/. Sapere cosa è ogni entry rimuove il mistero dalle diagnostiche "cosa è appena successo?".

Da Anonimo (non verificato) , 29 Aprile 2026

Introduzione

Il modello content-addressed di Git deduplica oggetti identici, ma blob simili-ma-non-identici (un file e la sua modifica successiva) costerebbero comunque dimensione piena ciascuno. I pack file risolvono questo con la compressione delta: memorizza un oggetto come una base più una sequenza di istruzioni "copy/insert" che producono un altro oggetto.

Come funziona

Quando impacchetta, Git confronta oggetti candidati (tipicamente blob di dimensione e tipo simili) e sceglie una base per ognuno. Il delta registra:

Da Anonimo (non verificato) , 29 Aprile 2026

Introduzione

Git memorizza gli oggetti in due formati fisici. Gli oggetti loose sono file individuali; gli oggetti packed vivono dentro un pack file con un corpo compresso a delta. Entrambe le forme descrivono gli stessi oggetti logici, indirizzati dagli stessi hash.

Layout loose

Ogni oggetto loose è in .git/objects/xx/yyy..., dove xx sono i primi due caratteri esadecimali dello SHA e yyy... sono i restanti 38. Il file è il byte deflato con zlib di <type> <size>\0<content>:

Da Anonimo (non verificato) , 29 Aprile 2026

Introduzione

Un ref simbolico è un riferimento il cui valore è il nome di un altro ref piuttosto che un hash di oggetto. L'esempio canonico è HEAD, che di solito contiene ref: refs/heads/main. I ref simbolici permettono a Git di tracciare "il branch corrente" come dato, non come stato.

Da Anonimo (non verificato) , 29 Aprile 2026

Introduzione

La "raggiungibilità" è la proprietà più importante di un oggetto Git. Un oggetto è raggiungibile se qualche ref porta ad esso tramite link parent o tree. Gli oggetti irraggiungibili sono candidabili al garbage collection.

Regole di raggiungibilità

Partendo da un ref qualsiasi: