W3docs

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 -> master

La 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.

git push

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> --forceForza 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> --allEsegue il push di tutti i branch locali verso il repository remoto.
git push <remote> --tagsEsegue 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-leaseForza il push solo se il branch remoto non si è spostato dall'ultimo fetch — un'alternativa più sicura a --force.
git push <remote> --dry-runMostra 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.git

Cosa 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 master

Ricorri 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 master

Come 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_name

Il comando git push origin :branch_name elimina il branch specificato (branch_name) dal repository remoto (origin) inviando un riferimento vuoto.

Come funziona

  1. git push: invia le modifiche dal repository Git locale a un repository remoto
  2. origin: il nome del repository remoto
  3. :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-name

Dopo 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 master

Esegue 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 --tags

Invia 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 --all

Invia 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 master

Simula 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 master

Esegue 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.

Esercitazione

Pratica
Quali affermazioni sono vere riguardo al comando 'git push'?
Quali affermazioni sono vere riguardo al comando 'git push'?
Was this page helpful?