Il comando git push è utilizzato per caricare i contenuti di un repository locale su uno remoto. I commit vengono trasferiti dal repository locale a uno remoto tramite push. È l'equivalente di git fetch, ma mentre tramite l'azione di recupero i commit vengono importati nei branch locali, con il push i commit vengono esportati nei branch remoti. I branch remoti vengono configurati tramite il comando git remote . L'operazione di push può sovrascrivere le modifiche, pertanto presta attenzione mentre la esegui. Questi problemi sono descritti di seguito.

Uso di git push

git push <remote> <branch>

Esegue il push del branch specificato su , insieme a tutti i commit e agli oggetti interni necessari. Ciò crea un branch locale nel repository di destinazione. Per impedire la sovrascrittura dei commit, Git non consente di eseguire il push quando risulta in un’unione senza avanzamento rapido nel repository di destinazione.

git push <remote> --force

Uguale al comando descritto sopra, ma forza il push anche se risulta in un’unione senza avanzamento rapido. Non utilizzare il flag --force a meno che tu non sia assolutamente sicuro di come procedere.

git push <remote> --all

Esegue il push di tutti i branch locali sul repository remoto specificato.

git push <remote> --tags

Non effettua il push automatico dei tag quando esegui il push di un branch o utilizzi l'opzione --all. Il flag --tags invia tutti i tag locali al repository remoto.

Discussione su git push

git push è utilizzato perlopiù per pubblicare e caricare le modifiche locali su un repository centrale. In seguito alla modifica di un repository locale, viene eseguito un push per condividere tali modifiche con i membri del team remoti.

Utilizzo di git push per pubblicare le modifiche

Il diagramma riportato sopra illustra quello che succede quando il master locale ha superato il master del repository centrale e tu pubblichi delle modifiche eseguendo git push origin master. Osserva come eseguire git push corrisponde essenzialmente a eseguire git merge master dall'interno del repository remoto.

Git push e sincronizzazione

git push è uno dei tanti componenti utilizzati nel processo di "sincronizzazione" Git generale. I comandi di sincronizzazione operano sui branch remoti configurati tramite il comando git remote . git push può essere considerato come un comando per il caricamento, mentre si può pensare a git fetch e a git pull come a dei comandi per il download. Una volta che i set di modifiche sono stati trasferiti tramite caricamento o download, è possibile eseguire il comando git merge sulla destinazione per integrare le modifiche.

Esecuzione del push sui repository bare

Una pratica Git recente e utilizzata di frequente è quella di impostare un repository --bare ospitato in remoto come repository di origine centrale. Questo repository di origine è spesso ospitato off-site tramite una terza parte attendibile come Bitbucket. Dal momento che il push crea problemi nella struttura del branch remoto, è più sicuro e più frequente eseguire il push sui repository creati con il flag --bare. I repository bare non dispongono di directory di lavoro e pertanto il push non altererà i contenuti delle directory di lavoro in corso. Per ulteriori informazioni sulla creazione di un repository bare, leggi la sezione dedicata a git init.

Come forzare il push

Git impedisce la sovrascrittura della cronologia del repository centrale rifiutando le richieste di push che risulterebbero in un'unione senza avanzamento rapido. Quindi, se la cronologia remota è diversa da quella locale, è necessario eseguire un pull del branch remoto e unirlo a quello locale e quindi provare a ripetere il push. Questa operazione è simile alla sincronizzazione necessaria in SVN con il repository centrale, tramite il comando svn update, prima di eseguire il commit di un set di modifiche.

Il flag --force ignora questo comportamento e fa in modo che il branch del repository remoto corrisponda a quello locale, eliminando eventuali modifiche upstream apportate dall'ultimo pull. L'unico caso in cui potrebbe essere necessario forzare il push è se ti accorgi che i commit appena condivisi non sono corretti e li correggi con un comando git commit --amend o con una riassegnazione interattiva. Tuttavia, devi avere la certezza assoluta che nessuno degli altri membri del team abbia eseguito un pull di tali commit prima di utilizzare l'opzione --force.

Esempi

Comando git push predefinito

L'esempio seguente descrive uno dei metodi standard per la pubblicazione dei contributi locali sul repository centrale. Innanzitutto, verifica che il master locale sia aggiornato recuperando la copia del repository centrale e riassegnando le modifiche. La riassegnazione interattiva è inoltre una buona opportunità per effettuare la pulizia dei commit prima di condividerli. Quindi, il comando git push invia tutti i commit sul master locale al repository centrale.

git checkout master
git fetch origin master
git rebase -i origin/master
# Squash commits, fix up commit messages etc.
git push origin master

Dal momento che abbiamo già verificato che il master locale fosse aggiornato, questa operazione dovrebbe tradursi in un'unione con avanzamento rapido e git push non dovrebbe restituire nessun errore sui problemi legati alle unioni senza avanzamento rapido descritti sopra.

Push forzato corretto

Il comando git commit accetta l'opzione --amend che consente di aggiornare il commit precedente. Un commit viene corretto spesso per aggiornarne il messaggio o per aggiungere nuove modifiche. Quando un commit viene corretto, il comando git push non riesce perché Git vedrà il commit corretto e quello remoto con contenuti diversi. Per eseguire il push di un commit corretto, occorre utilizzare l'opzione --force.

# make changes to a repo and git add
git commit --amend
# update the existing commit message
git push --force origin master

Nell'esempio precedente si presuppone che il comando venga eseguito su un repository esistente con una cronologia di commit. Il comando git commit --amend viene utilizzato per aggiornare il commit precedente e viene quindi forzato il push del commit corretto tramite l'opzione --force.

Eliminazione di un tag o di un branch remoto

Alcune volte, per scopi organizzativi o di contabilità, occorre eseguire la pulizia dei branch. Per eliminare completamente un branch, occorre eliminarlo in locale e in remoto.

git branch -D branch_name
git push origin :branch_name

Quanto illustrato sopra elimina il branch remoto denominato branch_name. L'invio di un nome di branch con due punti come prefisso al comando git push consente di eliminare il branch remoto.