Comportamento predefinito di “git push” senza un ramo specificato

Io uso il seguente comando per inviare al mio ramo remoto:

git push origin sandbox 

Se dico

 git push origin 

questo spinge anche i cambiamenti nelle altre mie filiali o aggiorna solo il mio attuale ramo? Ho tre rami: master , production e sandbox .

La documentazione di git push non è molto chiara su questo, quindi mi piacerebbe chiarire questo per sempre.

Quali rami e telecomandi eseguono esattamente i seguenti comandi git push ?

 git push git push origin 

origin sopra è un telecomando.

Capisco che git push [remote] [branch] spingerà solo quel ramo verso il remoto.

Puoi controllare il comportamento predefinito impostando push.default nella tua git config. Dalla documentazione di git-config (1) :

 push.default 

Definisce l’azione che git push dovrebbe eseguire se non viene fornito alcun refspec sulla riga di comando, nessun refspec è configurato nel remoto e nessun refspec è implicito da nessuna delle opzioni fornite sulla riga di comando. I valori possibili sono:

  • nothing : non spingere nulla

  • matching : spingere tutti i rami corrispondenti

    Tutti i rami che hanno lo stesso nome in entrambe le estremità sono considerati corrispondenti.

    Questo è l’impostazione predefinita in Git 1.x.

  • upstream : spinga il ramo corrente al suo ramo upstream (il tracking è un sinonimo deprecato per upstream)

  • current : spingere il ramo corrente in un ramo con lo stesso nome

  • simple : (nuovo in Git 1.7.11) come upstream, ma si rifiuta di premere se il nome del ramo upstream è diverso da quello locale

    Questa è l’opzione più sicura ed è adatta ai principianti.

    Questo diventerà il valore predefinito in Git 2.0.

Le modalità semplice, corrente e upstream sono per coloro che vogliono spingere un singolo ramo dopo aver terminato il lavoro, anche quando gli altri rami non sono ancora pronti per essere espulsi

Esempi di riga di comando:

Per visualizzare la configurazione corrente:

 git config --global push.default 

Per impostare una nuova configurazione:

 git config --global push.default current 

git push origin proverà tutte le modifiche sui rami locali che hanno i branch remoti corrispondenti origin come per git push

Funziona come git push , dove è il telecomando del ramo corrente (o origine, se nessun telecomando è configurato per il ramo corrente).

Dalla sezione Esempi della pagina man di git-push

Puoi impostare il comportamento predefinito per il tuo git con push.default

 git config push.default current 

o se hai molti repository e vuoi lo stesso per tutti allora

 git config --global push.default current 

La corrente in questa configurazione significa che per impostazione predefinita si sposterà il ramo corrente solo quando si esegue git push

Altre opzioni sono:

  • niente: non spingere nulla
  • corrispondenza: premi tutti i rami corrispondenti (predefinito)
  • tracciamento: spingere il ramo corrente su qualsiasi tracciamento
  • corrente: spingere il ramo corrente

AGGIORNAMENTO – NUOVO MODO DI FARE QUESTO

A partire da Git 1.7.11, effettuare le seguenti operazioni:

 git config --global push.default simple 

Questa è una nuova impostazione introdotta che funziona allo stesso modo della corrente, e sarà resa predefinita per git dalla v 2.0 in base alle voci

Ho appena eseguito il commit del mio codice su un ramo e l’ho spinto su github, in questo modo:

 git branch SimonLowMemoryExperiments git checkout SimonLowMemoryExperiments git add . git commit -a -m "Lots of experimentation with identifying the memory problems" git push origin SimonLowMemoryExperiments 

Ecco alcune informazioni molto utili e utili su Git Push : Git Push: Just the Tip

L’uso più comune di git push è quello di inviare le modifiche locali al repository pubblico upstream. Supponendo che l’upstream sia un remoto chiamato “origin” (il nome remoto predefinito se il tuo repository è un clone) e il ramo da aggiornare a / da è denominato “master” (il nome di ramo predefinito), questo è fatto con: git push origin master

git push origin i cambiamenti da tutti i rami locali ai rami corrispondenti all’origine remota.

git push origin master spingerà le modifiche dal ramo master locale al ramo master remoto.

git push origin master:staging trasferirà le modifiche dal ramo master locale al ramo di gestione temporanea remoto, se esistente.

(Marzo 2012)
Attenzione: quella politica di ” matching ” predefinita potrebbe cambiare presto
(a volte dopo git1.7.10 +) :

Vedi ” Per favore discuti: cosa dovrebbe fare” git push “quando non dici cosa spingere? ”

Nell’impostazione corrente (cioè push.default=matching ), git push senza argomento spinge tutti i rami che esistono localmente e remotamente con lo stesso nome .
Questo di solito è appropriato quando uno sviluppatore spinge al proprio repository pubblico, ma può essere fonte di confusione se non pericoloso quando si utilizza un repository condiviso.

La proposta è di cambiare l’impostazione predefinita in ” upstream , ovvero spingere solo il ramo corrente e spingerlo nel ramo da cui pull git pull.
Un altro candidato è ” current “; questo spinge solo il ramo corrente al ramo remoto con lo stesso nome.

Ciò che è stato discusso finora può essere visto in questo thread:

http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694

Le discussioni pertinenti precedenti includono:

Per partecipare alla discussione, invia i tuoi messaggi a: [email protected]

Ho appena inserito questo nella mia sezione alias .gitconfig e mi piace come funziona:

 pub = "!f() { git push -u ${1:-origin} `git symbolic-ref HEAD`; }; f" 

Spingerà il ramo attuale all’origine con git pub o un altro repository con git pub repo-name . Gustoso.

Un git push proverà a spingere tutti i rami locali sul server remoto, probabilmente è quello che non vuoi. Ho un paio di impostazioni di convenienza per affrontare questo:

Alias ​​”gpull” e “gpush” appropriatamente:

Nel mio ~ / .bash_profile

 get_git_branch() { echo `git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'` } alias gpull='git pull origin `get_git_branch`' alias gpush='git push origin `get_git_branch`' 

Quindi, l’esecuzione di “gpush” o “gpull” spingerà solo il mio ramo “attualmente attivo”.

È ansible premere il ramo corrente con il comando

 git push origin HEAD 

(preso da qui )

Puoi modificare il comportamento predefinito in .gitconfig , ad esempio:

 [push] default = current 

Per verificare le impostazioni correnti, esegui:

 git config --global --get push.default 

Piuttosto che usare alias, preferisco creare script git-XXX, così posso controllarli più facilmente (i nostri sviluppatori hanno una certa dir controllata dalla sorgente sul loro percorso per questo tipo di cose).

Questo script (chiamato git-setpush ) imposterà il valore di configurazione per il valore remote.origin.push a qualcosa che spingerà solo il ramo corrente:

 #!/bin/bash -eu CURRENT_BRANCH=$(git branch | grep '^\*' | cut -d" " -f2) NEW_PUSH_REF=HEAD:refs/for/$CURRENT_BRANCH echo "setting remote.origin.push to $NEW_PUSH_REF" git config remote.origin.push $NEW_PUSH_REF 

nota che, mentre stiamo usando Gerrit , imposta il target su refs/for/XXX per inserire un ramo di recensione. Presume anche che l’origine sia il tuo nome remoto.

Richiamalo dopo aver verificato un ramo con

 git checkout your-branch git setpush 

Ovviamente potrebbe essere adattato per fare anche il checkout, ma mi piacciono gli script per fare una cosa e farla bene

Ho aggiunto le seguenti funzioni nel mio file .bashrc per automatizzare queste attività. Fa git push / git pull + nome del ramo corrente.

 function gpush() { if [[ "x$1" == "xh" ]]; then cat <