Da Anonimo (non verificato) , 29 Aprile 2026

Introduzione

git init trasforma una directory ordinaria in un repository Git. Crea una directory nascosta .git contenente tutta la contabilità di Git: oggetti, ref, configurazione e hook. La working tree (i tuoi file normali) è lasciata invariata.

Inizializzare un progetto

mkdir my-project
cd my-project
git init
# Initialized empty Git repository in /home/ada/my-project/.git/

Da Git 2.28 puoi impostare il nome del branch iniziale dalla riga di comando:

git init --initial-branch=main
# oppure abbreviato
git init -b main

Cosa è appena successo

Ispeziona la nuova directory:

ls -a
ls .git

Vedrai HEAD, config, description, hooks/, info/, objects/ e refs/. Niente è ancora committato; HEAD punta a un branch non ancora nato.

Il tuo primo commit

  1. Crea un file: echo "# My Project" > README.md
  2. Mettilo in stage: git add README.md
  3. Fai commit: git commit -m "Initial commit"
echo "# My Project" > README.md
git add README.md
git commit -m "Initial commit"
git log --oneline

Repository bare

I server di solito ospitano repository bare senza working tree. Usa --bare:

git init --bare project.git

I repo bare sono il bersaglio dei push; non si modificano i file direttamente al loro interno.

Ri-inizializzare

Eseguire di nuovo git init in un repo esistente è sicuro; ri-applica i template e stampa "Reinitialized existing Git repository". Non cancella i commit.

Template

Per impostazione predefinita git init popola .git/hooks/ da /usr/share/git-core/templates/. Puoi sovrascrivere la directory dei template per iniettare i tuoi hook, un .gitignore predefinito o una description in ogni nuovo repo:

git init --template=~/.git-templates
git config --global init.templateDir ~/.git-templates

È così che le organizzazioni distribuiscono pre-commit hook standard a ogni nuovo clone senza che ogni sviluppatore copi i file manualmente.

Nome del branch iniziale

Molti progetti sono passati da master a main come nome del branch predefinito. La scelta è locale al tuo repo, ma far corrispondere il default del tuo provider di hosting evita confusione al primo push. Impostalo una volta globalmente e dimenticatene: git config --global init.defaultBranch main.

Dove Git smette di cercare

Git localizza il repository risalendo l'albero delle directory finché non trova una directory o un file .git. La risalita si ferma ai confini del filesystem per impostazione predefinita (core.discoveryAcrossFilesystem cambia questo). La variabile d'ambiente GIT_DIR sovrascrive completamente la discovery; GIT_WORK_TREE imposta una working tree non predefinita. Insieme ti permettono di operare su un repo il cui .git è in una posizione insolita:

GIT_DIR=/srv/repos/widget.git GIT_WORK_TREE=/var/www git status

Errori comuni

Eseguire git init nella tua home directory per errore, mettendo l'intera collezione di dotfile sotto un'unica radice di repository massiccia. Controlla sempre pwd prima. Un altro errore: cancellare .git per "ricominciare da capo" mantenendo il lavoro non committato. Va bene, ma renditi conto che tutta la storia è andata persa per sempre. Infine, non committare grossi binari in un repo appena inizializzato senza prima scrivere un .gitignore; te ne pentirai quando il repo si gonfierà. Esegui git status subito dopo git init per vedere cosa Git intende tracciare prima di mettere qualsiasi cosa in stage.