git push
Il comando git push
viene 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
git push <remote> --force
Uguale al comando descritto sopra, ma forza il push anche se risulta in un merge 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.
The above diagram shows what happens when your local main
has progressed past the central repository’s main
and you publish changes by running git push origin main
. Notice how git push
is essentially the same as running git merge main
from inside the remote repository.
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 merge senza avanzamento rapido. Quindi, se la cronologia remota è diversa da quella locale, è necessario eseguire un pull del branch remoto ed effettuarne il merge con 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
The following example describes one of the standard methods for publishing local contributions to the central repository. First, it makes sure your local main is up-to-date by fetching the central repository’s copy and rebasing your changes on top of them. The interactive rebase is also a good opportunity to clean up your commits before sharing them. Then, the git push
command sends all of the commits on your local main to the central repository.
git checkout main
git fetch origin main
git rebase -i origin/main
# Squash commits, fix up commit messages etc.
git push origin main
Since we already made sure the local main was up-to-date, this should result in a fast-forward merge, and git push
should not complain about any of the non-fast-forward issues discussed above.
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 main
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.