branch example - Comportamento predefinito di "git push" senza un ramo specificato




create remote (11)

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

[push]
  default = current

Per verificare le impostazioni correnti, esegui:

git config --global --get push.default

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.


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


È possibile premere il ramo corrente con il comando

git push origin HEAD

(preso da here )


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 <remote> , dove <remote> è il telecomando del ramo corrente (o origine, se nessun telecomando è configurato per il ramo corrente).

Dalla sezione Esempi della pagina man di git-push


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


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 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" == "x-h" ]]; then
    cat <<EOF
Usage: gpush
git: for current branch: push changes to remote branch;
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git push ${bname}
    set +x
  fi
}

function gpull()
{
  if [[ "x$1" == "x-h" ]]; then
    cat <<EOF
Usage: gpull
git: for current branch: pull changes from
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git pull ${bname}
    set +x
  fi
}

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.


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

(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 creato un alias in modo che ogni volta che creo un nuovo ramo, spinga e segua il ramo remoto di conseguenza. .bash_profile il seguente blocco nel file .bash_profile :

# Create a new branch, push to origin and track that remote branch
publishBranch() {
  git checkout -b $1
  git push -u origin $1
}
alias gcb=publishBranch

Uso : basta digitare gcb thuy/do-sth-kool con thuy/do-sth-kool è il mio nuovo nome di ramo.







git branch git-branch git-push