git push

Il comando git push è usato per caricare il contenuto del repository locale su un repository remoto. Il push è il modo in cui trasferisci i commit dal tuo repository locale ad un repo remoto. È la controparte di git fetch, ma mentre il fetching importa i commit nei rami locali, il pushing esporta i commit nei rami remoti. I rami remoti sono configurati usando il comando git remote. Il push ha il potenziale di sovrascrivere i cambiamenti, bisogna fare attenzione quando si esegue il push. Questi problemi sono discussi di seguito.

Uso di Git push

git push <remote> <branch>

Spingi il ramo specificato in , insieme a tutti i commit necessari e gli oggetti interni. Questo crea un ramo locale nel repository di destinazione. Per evitare di sovrascrivere i commit, Git non ti permette di fare il push quando risulta in una fusione non veloce nel repository di destinazione.

git push <remote> --force

Come il comando precedente, ma forza il push anche se risulta in una fusione non veloce. Non usare il flag --force a meno che tu non sia assolutamente sicuro di sapere cosa stai facendo.

git push <remote> --all

Push di tutti i tuoi rami locali sul remoto specificato.

git push <remote> --tags

I tag non vengono spinti automaticamente quando spingi un ramo o usi l’opzione --all. Il flag --tags invia tutti i tuoi tag locali al repository remoto.

Discussione su Git push

git push è più comunemente usato per pubblicare e caricare i cambiamenti locali in un repository centrale. Dopo che un repository locale è stato modificato viene eseguito un push per condividere le modifiche con i membri del team remoto.

Usare git push per pubblicare le modifiche

Il diagramma sopra mostra cosa succede quando il vostro master locale ha superato il master del repository centrale e pubblicate le modifiche eseguendo git push origin master. Notate come git push è essenzialmente lo stesso che eseguire git merge master dall’interno del repository remoto.

Git push e sincronizzazione

git push è uno dei tanti componenti usati nel processo generale di “sincronizzazione” di Git. I comandi di sincronizzazione operano su rami remoti che sono configurati utilizzando il comando git remotegit push può essere considerato un comando di “upload” mentre, git fetch e git pull possono essere considerati come comandi di “download”. Una volta che i set di modifiche sono stati spostati tramite un download o un upload, un git merge può essere eseguito nella destinazione per integrare le modifiche.

Spingere verso repository nudi

Una pratica Git moderna e frequentemente usata è quella di avere un --bare repository ospitato in remoto che agisce come repository di origine centrale. Questo repository di origine è spesso ospitato fuori sede con una terza parte affidabile come Bitbucket. Poiché spingere incasina la struttura dei rami remoti, è più sicuro e più comune spingere ai repository che sono stati creati con il flag --bare. I repository nudi non hanno una directory di lavoro quindi un push non altererà alcun contenuto della directory di lavoro in corso. Per maggiori informazioni sulla creazione dei repository nudi, leggi git init.

Force Pushing

Git ti impedisce di sovrascrivere la storia del repository centrale rifiutando le richieste di push quando risultano in un merge non fast-forward. Quindi, se la storia remota si è discostata dalla tua storia, devi estrarre il ramo remoto e fonderlo in quello locale, poi provare a spingere di nuovo. Questo è simile a come SVN ti fa sincronizzare con il repository centrale tramite svn update prima di commettere un changeset.

Il flag --force sovrascrive questo comportamento e fa sì che il ramo del repository remoto corrisponda a quello locale, cancellando qualsiasi cambiamento a monte che possa essersi verificato dall’ultima estrazione. L’unica volta che dovresti aver bisogno di forzare il push è quando ti rendi conto che i commit che hai appena condiviso non erano del tutto giusti e li hai corretti con un git commit --amend o un rebase interattivo. Tuttavia, devi essere assolutamente certo che nessuno dei tuoi compagni di squadra abbia tirato quei commit prima di usare l’opzione --force.

Default git push

L’esempio seguente descrive uno dei metodi standard per pubblicare i contributi locali al repository centrale. Per prima cosa, si assicura che il tuo master locale sia aggiornato recuperando la copia del repository centrale e facendo il rebase delle tue modifiche su di esso. Il rebase interattivo è anche una buona opportunità per pulire i tuoi commit prima di condividerli. Poi, il comando git push invia tutti i commit sul tuo 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

Siccome ci siamo già assicurati che il master locale fosse aggiornato, questo dovrebbe risultare in un fast-forward merge, e git push non dovrebbe lamentare nessuno dei problemi non fast-forward discussi sopra.

Force push modificato

Il comando git commit accetta un’opzione --amend che aggiornerà il commit precedente. Un commit è spesso modificato per aggiornare il messaggio di commit o aggiungere nuove modifiche. Una volta che un commit è modificato un git push fallirà perché Git vedrà il commit modificato e il commit remoto come contenuti divergenti. L’opzione --force deve essere usata per spingere un commit modificato.

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

L’esempio precedente presuppone che venga eseguito su un repository esistente con una storia di commit. git commit --amend viene usato per aggiornare il commit precedente. Il commit modificato viene poi spinto forzatamente usando l’opzione --force.

Cancellare un ramo remoto o un tag

A volte i rami devono essere ripuliti per scopi contabili o organizzativi. Per eliminare completamente un ramo, questo deve essere eliminato localmente e anche remotamente.

git branch -D branch_name
git push origin :branch_name

Questo cancellerà il ramo remoto chiamato branch_name passando un nome di ramo preceduto da due punti a git push cancellerà il ramo remoto.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *