git push
Scopri il comando git push, la sua sintassi, le opzioni più comuni e consigli importanti per utilizzarlo al meglio.
Questa pagina spiega cosa fa git push, la sintassi e le opzioni più utili, come funziona il push verso repository bare e non-bare, come impostare un branch upstream, come eseguire un force-push in sicurezza e come eliminare un branch remoto. Gli esempi utilizzano comandi Git e output accurati che puoi seguire passo passo.
Definizione
Il comando git push carica i commit dal repository locale a un repository remoto. Il push è l'opposto del fetch: mentre git fetch importa i commit nei branch di tracciamento locali, git push esporta i commit locali verso i branch remoti in modo che i collaboratori possano vederli.
La sintassi di base è:
git push <remote> <branch><remote> è il nome del remote (più comunemente origin), e <branch> è il branch locale i cui commit vuoi pubblicare.
Utilizzo di git push
Il comando git push viene comunemente usato per pubblicare le modifiche locali in un repository centrale. Dopo aver eseguito il commit delle modifiche in locale, si esegue git push per condividerle con il resto del team. È uno dei comandi coinvolti nel flusso di lavoro di sincronizzazione. Questi comandi operano sui branch remoti configurati con il comando git remote: i commit vengono caricati con git push e scaricati con git fetch e git pull. Dopo il download, git merge integra le modifiche nel branch di lavoro.
Un push riuscito stampa un riepilogo di ciò che è stato trasferito. Ad esempio, il push di due nuovi commit su master appare così:
$ git push origin master
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Writing objects: 100% (6/6), 612 bytes | 612.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To github.com:example/repo.git
a1b2c3d..e4f5g6h master -> masterLa riga a1b2c3d..e4f5g6h master -> master conferma quali commit sono stati trasferiti e che il tuo master locale corrisponde ora al master remoto.
Il diagramma seguente mostra la progressione del master locale oltre il master del repository centrale, e la pubblicazione di quelle modifiche tramite git push origin master.

Opzioni comuni
git push <remote> <branch> | Esegue il push del branch specificato verso <remote> con i commit necessari, creando un branch remoto nel repository di destinazione. |
|---|---|
git push <remote> --force | Forza il push anche se comporta un aggiornamento non-fast-forward. Assicurati che nessuno abbia già eseguito il pull dei commit prima di usare l'opzione --force. |
git push <remote> --all | Esegue il push di tutti i branch locali verso il repository remoto. |
git push <remote> --tags | Esegue il push dei tag dai branch locali al repository remoto. L'opzione --all non trasferisce i tag. |
git push -u <remote> <branch> | Esegue il push del branch e lo registra come branch upstream (di tracciamento), così i futuri git push e git pull potranno essere eseguiti senza argomenti. |
git push <remote> --force-with-lease | Forza il push solo se il branch remoto non si è spostato dall'ultimo fetch — un'alternativa più sicura a --force. |
git push <remote> --dry-run | Mostra cosa verrebbe inviato senza trasmettere nulla al remote. |
Come eseguire il push verso repository bare
Un repository bare è uno creato con il flag --bare (git init --bare o git clone --bare). Non ha una directory di lavoro, quindi nessuno può modificare file o eseguire commit direttamente al suo interno. Questo lo rende sicuro per ricevere push, ed è per questo che i repository centrali/condivisi (quelli ospitati su un server o un servizio come GitHub) sono bare. Eseguire il push verso un repository non-bare il cui branch di lavoro è estratto può entrare in conflitto con l'albero di lavoro di quel branch, ed è per questo che Git rifiuta tali push per impostazione predefinita.
# create a shared central repository
git init --bare central.gitCosa succede quando un push viene rifiutato
Git rifiuta il push quando il branch remoto contiene commit che non hai in locale — un aggiornamento non-fast-forward. Di solito significa che un collega ha eseguito il push prima. L'errore appare così:
$ git push origin master
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'github.com:example/repo.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.La soluzione è integrare prima il lavoro remoto, poi eseguire di nuovo il push:
git pull origin master # fetch + merge (or use --rebase)
git push origin masterRicorri a --force solo quando vuoi deliberatamente sovrascrivere la cronologia remota (vedi sotto) — non per aggirare questo controllo di sicurezza sui branch condivisi.
Force pushing
Il flag --force sovrascrive il branch remoto con quello locale, eliminando qualsiasi commit upstream che non è stato ancora scaricato. Usalo solo quando hai intenzionalmente riscritto la cronologia — ad esempio dopo git commit --amend o un git rebase interattivo — e sei sicuro che nessun altro abbia costruito sui commit che stai sostituendo. Quando un commit viene modificato con amend o rebase, il suo hash cambia, quindi Git lo tratta come contenuto divergente rispetto al commit remoto e rifiuta un push normale; --force è necessario per pubblicare il commit riscritto.
Per i branch condivisi, preferisci --force-with-lease (trattato di seguito): si rifiuta di sovrascrivere il lavoro ricevuto dal remote dopo l'ultimo fetch, così non puoi distruggere silenziosamente i commit di un collega.
git push --force
# make changes to a repo and git add
git commit --amend
# update the existing commit message
git push --force origin masterCome eliminare un branch remoto
Ecco un esempio di eliminazione del branch remoto. Il branch_name con prefisso di due punti passato a git push eliminerà il branch remoto:
delete remote branch, git push
git branch -D branch_name
git push origin :branch_nameIl comando git push origin :branch_name elimina il branch specificato (branch_name) dal repository remoto (origin) inviando un riferimento vuoto.
Come funziona
git push: invia le modifiche dal repository Git locale a un repository remotoorigin: il nome del repository remoto:branch_name: un refspec che rappresenta un riferimento vuoto, che elimina di fatto il branch specificato dal repository remoto
Quindi quando esegui git push origin :branch_name, Git eliminerà il branch branch_name dal repository remoto origin.
Nota che questo comando può essere pericoloso se usato in modo errato, poiché eliminerà il branch senza alcuna conferma o possibilità di recupero. Assicurati di verificare il nome del branch e di volerlo davvero eliminare prima di eseguire il comando.
Usare il flag -u per il primo push su un branch
Quando hai un branch locale e vuoi eseguirne il push nel repository remoto per la prima volta, devi specificare quale branch del repository remoto intendi. In Git, il flag -u viene usato con il comando git push per impostare il branch upstream per il branch corrente. Quando usi il flag -u, Git creerà un collegamento tra il branch locale e il branch remoto. Questo collegamento è utile per semplificare i comandi git pull e git push in futuro, poiché consente a Git di ricordare quale branch remoto corrisponde al branch locale.
Il flag -u è l'abbreviazione di --set-upstream. Quando usi questo flag, lo vedrai tipicamente usato così:
Use -u flag for the first push on a branch
git push -u origin your-branch-nameDopo questo, il branch locale traccia origin/your-branch-name. Da quel momento in poi puoi eseguire git push e git pull senza argomenti aggiuntivi mentre sei su quel branch, e git status riporterà di quanti commit sei avanti o indietro rispetto al remote. Consulta git branch per ulteriori informazioni sui branch locali e di tracciamento remoto.
Esempi dei flag più usati
Ecco brevi esempi dei flag più utili di git push.
-f (force)
git push -f origin masterEsegue il force-push del branch master locale verso origin, sovrascrivendo qualsiasi commit sul master remoto che non hai in locale. -f è la forma breve di --force. Usalo con cautela — può cancellare commit inviati da altri se stanno lavorando sullo stesso branch.
--tags
git push origin --tagsInvia tutti i tag locali verso origin. I tag contrassegnano punti importanti nella cronologia, come rilasci o milestone. Un normale git push non trasferisce i tag, quindi questo flag (o il push di un tag specifico con git push origin <tagname>) è il modo per pubblicarli. Consulta git tag per ulteriori informazioni sulla creazione dei tag.
--all
git push origin --allInvia tutti i branch locali verso origin con un unico comando. Nota che --all non include i tag — combinalo con un push separato --tags se hai bisogno di entrambi.
--dry-run
git push --dry-run origin masterSimula il push e riporta cosa verrebbe inviato, senza trasferire nulla. Utile per confermare esattamente quali commit e riferimenti un push aggiornerà prima di eseguirlo davvero.
--force-with-lease
git push --force-with-lease origin masterEsegue il force-push di master verso origin solo se il branch remoto punta ancora dove puntava l'ultima volta che hai eseguito il fetch. Se qualcuno ha eseguito il push nel frattempo, il comando si interrompe invece di sovrascrivere il loro lavoro. Questa è l'alternativa più sicura a -f/--force.