Introduzione
git push carica i commit locali su un remote e aggiorna i branch e i tag di quel remote. È così che il tuo lavoro diventa visibile ai collaboratori.
Push di base
git push # branch corrente al suo upstream
git push origin main # esplicito
git push -u origin feature/login # imposta l'upstream e fa push
Il flag -u (o --set-upstream) collega il branch locale a quello remoto in modo che i futuri git push e git pull non abbiano bisogno di argomenti.
Push dei tag
I tag non vengono pushati per default:
git push origin v1.2.3
git push origin --tags # tutti i tag
git push --follow-tags # tag raggiungibili dai commit pushati
--follow-tags è il default più sicuro per i workflow di rilascio.
Cancellare branch remoti
git push origin --delete feature/login
# equivalentemente
git push origin :feature/login
Force push in sicurezza
Riscrivere la storia (rebase, amend, squash) richiede un force push. Preferisci sempre --force-with-lease, che rifiuta di calpestare ref che si sono mossi sul server:
git push --force-with-lease
git push --force-with-lease=feature/login:abcd1234
Non fare mai --force alla cieca su un branch condiviso come main.
Configurare i default di push
git config --global push.default simple # default da 2.0
git config --global push.autoSetupRemote true # 2.37+: auto -u
Con push.autoSetupRemote impostato, un semplice git push su un nuovo branch crea il branch remoto e li collega automaticamente.
Cosa succede durante il push
- Git locale negozia con il remote per trovare commit comuni.
- Impacchetta e carica solo gli oggetti mancanti.
- Il remote esegue gli hook
pre-receiveeupdate. - Se accettati, i ref vengono aggiornati atomicamente.
- L'hook
post-receiveviene eseguito (CI, mirroring, ecc.).
Push atomici e firmati
--atomic trasforma i push multi-ref in una singola transazione; o tutti i ref si aggiornano o nessuno, prevenendo deployment parziali. --signed invia un certificato di push firmato GPG che alcuni host loggano per audit:
git push --atomic origin main release/1.2
git push --signed origin main
Per i sistemi automatizzati, l'opzione --receive-pack ti permette di specificare un receive-pack alternativo sul server, occasionalmente necessario per host con binari non standard. Usa sempre git push --dry-run quando script con push distruttivi per la prima volta.
Errori comuni
Pushare su main quando intendevi un feature branch, perché hai dimenticato su quale branch eri. Esegui prima git status. Usare git push --force contro main e riscrivere i commit di altre persone; recupera con il reflog del remote (se hai accesso shell) o ri-pushando dal clone di un compagno di team. Pushare senza credenziali configurate e bloccarsi su un prompt password; configura un credential helper o una chiave SSH. Infine, push grandi possono fallire all'ultimo momento se un hook li rifiuta; in tal caso, il messaggio di rifiuto nomina il commit incriminato. Leggilo con cura piuttosto che ri-eseguire alla cieca.