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

Esecuzione del push sui repository bare

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

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