Articolo originale: Git Push to Remote Branch – How to Push a Local Branch to Origin

Il comando fondamentale per fare il push di un branch locale a un repository remoto è git push.

Questo comando presenta una varietà di opzioni e parametri aggiuntivi e in quest'articolo troverai quelli più utilizzati.

Come fare il push di un branch locale all'origin

Se esegui il semplice comando git push, Git sceglierà di default altri due parametri: il repository remoto e il branch da cui fare il push.

La forma generica del comando è:

$ git push <remote> <branch>

Di default, Git sceglie origin per il remoto e il tuo branch attuale come branch da mandare.

Se il branch corrente è il main, il comando git push fornirà i due parametri di default, eseguendo effettivamente git push origin main.

Nell'esempio qui sotto, il branch remoto origin è un repository GitHub e il branch corrente è main:

(main)$ git remote -v 
origin  git@github.com:johnmosesman/burner-repo.git (fetch)
origin  git@github.com:johnmosesman/burner-repo.git (push)

(main)$ git push
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 16 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 274 bytes | 274.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:johnmosesman/burner-repo.git
   b7f661f..ab77dd6  main -> main

Dall'output puoi vedere che è stato fatto il push del branch locale main al branch remoto main:

To github.com:johnmosesman/burner-repo.git
   b7f661f..ab77dd6  main -> main

Come forzare il push di un branch in Git

Normalmente, fai il push a un branch e aggiungi la sua storia dei commit.

Ci sono delle volte in cui hai bisogno di sovrascrivere la storia di un branch.

Ci sono un paio di ragioni per farlo.

La prima è per sistemare un errore, anche se è probabilmente meglio fare un nuovo commit annullando i cambiamenti.

Il secondo e più comune scenario è in seguito a un'azione come un  rebase, che cambia la storia dei commit:

Internamente, Git compie un rebase creando nuovi commit e applicandoli alla base specificata. È molto importante capire che anche se il branch sembra non essere stato modificato, è composto da commit completamente nuovi.

Un rebase crea commit completamente nuovi.

Questo vuol dire che se provi a fare il push di un branch su cui è stato fatto il rebase localmente (ma non in remoto), il repository remoto riconoscerà che la storia dei commit è stata cambiata, e ti impedirà di fare il push finché non metti a posto le differenze:

(my-feature)$ git push
To github.com:johnmosesman/burner-repo.git
 ! [rejected]        my-feature -> my-feature (non-fast-forward)
error: failed to push some refs to 'git@github.com:johnmosesman/burner-repo.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Puoi eseguire git pull per fare unificare le differenze, ma se vuoi davvero sovrascrivere il repository remoto puoi aggiungere al tuo push il flag --force:

(my-feature)$ git push --force origin my-feature
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 184 bytes | 184.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To github.com:johnmosesman/burner-repo.git
 + edb64e2...52f54da my-feature -> my-feature (forced update)

Nota: puoi usare la scorciatoia -f invece di --force.

Un push forzato è un'azione distruttiva. Usa questo comando solo se sei sicuro di quello che stai facendo.

Force with lease

A volte potresti aver bisogno di forzare un push, ma solo se nessun altro ha contribuito al branch.

Se qualcun altro contribuisce al tuo branch e manda i suoi cambiamenti al remoto (forzando il push), sovrascriverai le sue modifiche.

Per evitare questa situazione, puoi usare l'opzione --force-with-lease.

Di nuovo, dalla documentazione:

--force-with-lease da solo, senza specificare dettagli, proteggerà tutti i riferimenti remoti che stanno per essere aggiornati, richiedendo che il loro valore attuale resti uguale a quello del branch di tracciamento del remoto.

In pratica, stai dicendo a Git di forzare l'aggiornamento di questo branch solo se è uguale all'ultima volta.

Se stai collaborando con altri sul tuo branch, sarebbe bene evitare di usare --force o almeno cercare di usare --force-with-lease per evitare di perdere delle modifiche apportate da altri collaboratori.

Come fare il push di un branch con un nome diverso su Git

Generalmente, fai il push del tuo branch locale al remoto con lo stesso nome, ma non sempre.

Per fare il push a un branch con nome diverso, devi soltanto specificare il nome del branch di cui vuoi fare il push e il nome del branch verso cui farlo, separati da due punti (:).

Ad esempio, se vuoi fare il push di un branch chiamato some-branch a my-feature:

(some-branch)$ git push origin some-branch:my-feature
Total 0 (delta 0), reused 0 (delta 0)
To github.com:johnmosesman/burner-repo.git
 + 728f0df...8bf04ea some-branch -> my-feature

Come fare il push di tutti i branch locali al remoto

Non avrai bisogno di fare il push di tutti i branch dal locale molto spesso, ma se devi, puoi farlo aggiungendo il flag --all:

(main)$ git branch
* main
  my-feature

(main)$ git push --all
...
To github.com:johnmosesman/burner-repo.git
   b7f661f..6e36148  main -> main
 * [new branch]      my-feature -> my-feature

Conclusione

Il comando git push è uno dei comandi che userai più spesso ed esistono tantissime opzioni che puoi abbinare al suo utilizzo. Ti invito a leggere la documentazione per opzioni e scorciatoie utili.

Grazie per aver letto quest'articolo.