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 , 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 merge 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 merge senza avanzamento rapido. Non utilizzare il flag --force
a meno che tu non sia assolutamente sicuro di come procedere.
Esegue il push di tutti i branch locali sul repository remoto specificato.
git push <remote> --tags
materiale correlato
Registro Git avanzato
Scopri la soluzione
Impara a utilizzare Git con Bitbucket Cloud
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.
Il diagramma riportato sopra illustra quello che succede quando il main
locale ha superato il master
del repository centrale e tu pubblichi delle modifiche eseguendo git push origin main
. Osserva come eseguire git push
corrisponde essenzialmente a eseguire git merge main
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 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
L'esempio seguente descrive uno dei metodi standard per la pubblicazione dei contributi locali sul repository centrale. Innanzitutto, verifica che il main 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 main locale al repository centrale.
git checkout main
git fetch origin main
git rebase -i origin/main
# Squash commits, fix up commit messages etc.
git push origin main
Dal momento che abbiamo già verificato che il main locale fosse aggiornato, questa operazione dovrebbe tradursi in un merge con avanzamento rapido e git push
non dovrebbe restituire errori sui problemi legati ai merge 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 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.
Condividi l'articolo
Argomento successivo
Letture consigliate
Aggiungi ai preferiti queste risorse per ricevere informazioni sui tipi di team DevOps e aggiornamenti continui su DevOps in Atlassian.