Comportamento padrão de "git push" sem uma ramificação especificada

1366

Eu uso o seguinte comando para enviar para minha ramificação remota:

git push origin sandbox

Se eu disser

git push origin

isso também altera as outras ramificações ou atualiza apenas minha ramificação atual? Eu tenho três ramos: master, productione sandbox.

A git pushdocumentação não é muito clara sobre isso, então eu gostaria de esclarecer isso definitivamente.

Quais ramificações e controles remotos os seguintes git pushcomandos são atualizados exatamente?

git push 
git push origin

origin acima é um controle remoto.

Eu entendo que git push [remote] [branch]empurrará apenas esse ramo para o controle remoto.

PlagueHammer
fonte
Em relação à configuração das ferramentas diff em geral e ao novo script git difftool, adicionei uma nova resposta nesta outra pergunta do SO: stackoverflow.com/questions/255202/…
VonC 4/09/09
67
Eu fiz um post no blog sobre o comportamento surpreendente de git push, o que pode ser interessante
Mark Longair 4/11/11
1
@ Mark: em outro trabalho, empurrando apenas a ramificação atual para seu rastreamento upstream. Agradável.
VonC
help.github.com/articles/pushing-to-a-remote colocando este link aqui para ajuda imediata para os novatos como eu
MycrofD

Respostas:

1591

Você pode controlar o comportamento padrão definindo push.default em sua configuração do git. Na documentação do git-config (1) :

push.default

Define a ação que o git push deve executar se nenhum refspec for fornecido na linha de comandos, nenhum refspec estiver configurado no controle remoto e nenhum refspec estiver implícito em nenhuma das opções fornecidas na linha de comandos. Os valores possíveis são:

  • nothing: não empurre nada

  • matching: empurra todos os ramos correspondentes

    Todos os ramos com o mesmo nome nos dois extremos são considerados correspondentes.

    Isso costumava ser o padrão, mas não desde o Git 2.0 ( simpleé o novo padrão).

  • upstream: envie a ramificação atual para a ramificação upstream ( trackingé um sinônimo obsoleto para upstream)

  • current: envia a ramificação atual para uma ramificação com o mesmo nome

  • simple: (novo no Git 1.7.11) como upstream, mas se recusa a enviar por push se o nome da ramificação upstream for diferente do local

    Esta é a opção mais segura e é adequada para iniciantes.

    Este modo se tornou o padrão no Git 2.0.

Os modos simples, atual e upstream são para aqueles que desejam enviar uma única ramificação após concluir o trabalho, mesmo quando as outras ramificações ainda não estão prontas para serem enviadas.

Exemplos de linha de comando:

Para visualizar a configuração atual:

git config --global push.default

Para definir uma nova configuração:

git config --global push.default current
UncleZeiv
fonte
11
Provavelmente vale a pena notar que isso é novo na v1.6.3: kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt
CB Bailey
8
Esse "push.default" é a melhor coisa de todos os tempos para trabalhar com vários repositórios. Defina-o como "rastreamento" e você está bem. Combinado com ramificação - ajuste a montante, tornando o processo de empurrar e puxar muito mais conveniente.
Jspwain #
13
"tracking" é o sinônimo preterido para "upstream": kernel.org/pub/software/scm/git/docs/git-config.html
LuckyMalaka
22
Vale a pena notar que, a partir do Git 1.7.11, existe um novo simplemodo. Este modo pretende se tornar o padrão no futuro. simplefunciona como upstream, mas como currentrequer que os nomes das ramificações sejam os mesmos nas duas extremidades.
Kai
9
Vale ressaltar que, a partir do Git 2.0, o simplecomportamento agora é o padrão.
do0g
209

Você pode configurar o comportamento padrão para o seu git com push.default

git config push.default current

ou se você tiver muitos repositórios e quiser o mesmo para todos,

git config --global push.default current

A corrente nesta configuração significa que, por padrão, você enviará o ramo atual ao executar o git push

Outras opções são:

  • nada: não empurre nada
  • Correspondência: pressione todas as ramificações correspondentes (padrão)
  • rastreamento: envie a ramificação atual para o que estiver rastreando
  • current: envia o ramo atual

ATUALIZAÇÃO - NOVA MANEIRA DE FAZER ISSO

No Git 1.7.11, faça o seguinte:

git config --global push.default simple

Essa é uma nova configuração introduzida que funciona da mesma maneira que a atual e será padronizada para o git da v 2.0 de acordo com os rumores

Christoffer
fonte
29
Sim, eu li a resposta a que você está se referindo, mas essa resposta diz apenas o que fazer e não como fazê-lo. Então eu adicionei minha resposta para que todas as informações necessárias para configurá-la estejam na mesma página.
Christoffer
3
ESTÁ BEM; é melhor para sugerir uma edição para o referido post, porque ninguém vai ver a sua resposta, uma vez que não é provável que obter o maior número de votos
charlesb
como alguém poderia puxar para o ramo atual? origem git pull?
Francois
200

git push originvai empurrar todas as alterações nas filiais locais que tenham filiais remotas correspondentes no originQuantogit push

Funciona como git push <remote>, onde <remote>é o controle remoto da filial atual (ou origem, se nenhum controle remoto estiver configurado para a filial atual).

Na seção Exemplos da git-pushpágina de manual

baudtack
fonte
2
Sim, isso deixa claro. Provavelmente estou executando uma versão mais antiga do git (1.6.1.1 Mac OS X), que não possui esses exemplos na página de manual.
PlagueHammer 4/06/2009
Provavelmente estou executando o 1.6.3.1. Eu encontrei no site que eu vinculei no entanto.
baudtack
2
Portanto, no meu caso, onde todas as ramificações locais têm a mesma "origem" remota, "git push" seria exatamente o mesmo que "git push origin", que enviaria apenas as ramificações locais que possuem uma ramificação correspondente no controle remoto.
PlagueHammer 4/06/2009
@Debajit Right on! Ótima pergunta, a propósito. Eu sempre assumi que o git push apenas empurraria o ramo atual. Aparentemente não! Muito bom saber.
baudtack 4/06/2009
5
Esta pergunta é antiga, mas para qualquer pessoa nova, o @docgnome está certo. Apenas executar 'git push origin' empurrará todos os ramos, em vez de apenas o ramo atual. Use 'git push -f -v -n origin development' para forçar o envio de um ramo chamado development. Use o sinalizador -n para simular o resultado do git push, para que você possa ver com antecedência quais ramificações serão afetadas. Se parecer bom, execute o 'git push -f -v origin development'. Isto pode ser útil stackoverflow.com/questions/3741136/git-push-f-vs
Dylan Valade
54

Eu apenas comprometi meu código em um ramo e o empurrei para o github, assim:

git branch SimonLowMemoryExperiments
git checkout SimonLowMemoryExperiments
git add .
git commit -a -m "Lots of experimentation with identifying the memory problems"
git push origin SimonLowMemoryExperiments
neoneye
fonte
3
Você pode condensar o commit em `git commit -am" ... "`
James Harrington
17
Esta resposta tem algo a ver com a pergunta? :?
Asim KT
26

Aqui estão algumas informações muito úteis e úteis sobre o Git Push : Git Push: apenas a dica

O uso mais comum do git push é enviar as alterações locais para o seu repositório público upstream. Supondo que o upstream seja um remoto chamado "origem" (o nome remoto padrão se o seu repositório for um clone) e a ramificação a ser atualizada para / de for denominada "master" (o nome padrão da ramificação), isso é feito com:git push origin master

git push origin enviará alterações de todos os ramos locais para ramos correspondentes no remoto de origem.

git push origin master enviará alterações da ramificação principal local para a ramificação principal remota.

git push origin master:staging enviará as alterações da ramificação mestre local para a ramificação temporária remota, se existir.

Mukesh Chapagain
fonte
git push origin branch_namepor algum motivo, empurre não apenas o branch_namebranch, mas também outros ramos locais (git versão 1.9.1).
mrgloom
git push origin master:stagingé uma jóia escondida incrível!
Shakeel
19

(Março de 2012)
Cuidado: essa matchingpolítica " " padrão pode mudar em breve
(algumas vezes após o git1.7.10 +)
:

Consulte " Por favor, discuta: o que o" git push "deve fazer quando você não diz o que empurrar? "

Na configuração atual (ou seja push.default=matching), git pushsem argumento, enviará todos os ramos que existem local e remotamente com o mesmo nome .
Isso geralmente é apropriado quando um desenvolvedor envia para seu próprio repositório público, mas pode ser confuso se não perigoso ao usar um repositório compartilhado.

A proposta é alterar o padrão para ' upstream' , ou seja, empurre apenas o ramo atual, e empurre-o para o ramo que o pull git puxaria.
Outro candidato é ' current'; isso envia apenas a ramificação atual para a ramificação remota com o mesmo nome.

O que foi discutido até agora pode ser visto neste tópico:

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

As discussões relevantes anteriores incluem:

Para participar da discussão, envie suas mensagens para: [email protected]

VonC
fonte
18

Acabei de colocar isso na minha seção de aliases .gitconfig e adoro como ele funciona:

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

Empurrará a ramificação atual para a origem git pubou outro repo com git pub repo-name. Saboroso.

Mat Schaffer
fonte
4
Isso é legal, mas infelizmente assume que o ramo tem o mesmo nome no outro repositório. Tente em git push -u --repo="origin" $1;vez disso. Ele funciona muito bem, exceto se você empurrar para outro repositório, o nome da ramificação será o nome usado por outro repositório, não o que você está empurrando a partir
Casebash
Ei, obrigado! Me faz querer fazer uma versão mais completa que verifique o status do rastreamento antes de enviar. Mas vou ficar com o meu por enquanto, já que raramente tenho nomes diferentes de ramificações entre repos.
Mat Schaffer
10

Você pode enviar a ramificação atual com o comando

git push origin HEAD

(tirado daqui )

Andriy F.
fonte
8

Um git push tentará enviar todas as ramificações locais para o servidor remoto, provavelmente é o que você não deseja. Tenho algumas conveniências configuradas para lidar com isso:

Alias ​​"gpull" e "gpush" adequadamente:

No meu ~ / .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`'

Assim, executar "gpush" ou "gpull" enviará apenas o meu ramo "atualmente ativado".

Cody Caughlan
fonte
3
Se você sempre deseja o comportamento do gpush, também pode configurar remote.origin.push = HEAD (por exemplo, "git config remote.origin.push HEAD"), conforme mencionado na seção de exemplos da página do manual git-push.
Trevor Robinson
5
Isso não é necessário se você olhar para o post acima de "Brian L".
jpswain
1
É, como não há equv. Para puxar pull.default
#
8

Você pode alterar esse comportamento padrão no seu .gitconfig, por exemplo:

[push]
  default = current

Para verificar as configurações atuais, execute:

git config --global --get push.default
kenorb
fonte
3

Em vez de usar aliases, prefiro criar scripts git-XXX para poder controlá-los na fonte com mais facilidade (todos os nossos desenvolvedores têm um determinado diretório de origem no caminho para esse tipo de coisa).

Este script (chamado git-setpush) definirá o valor de configuração remote.origin.pushpara algo que apenas enviará o ramo atual:

#!/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

observe que, enquanto estamos usando Gerrit, ele define o alvo para refs/for/XXXentrar em uma ramificação de revisão. Ele também assume que origem é seu nome remoto.

Invoque-o depois de verificar uma ramificação com

git checkout your-branch
git setpush

Obviamente, poderia ser adaptado para fazer também a verificação geral, mas eu gosto de scripts para fazer uma coisa e fazê-lo bem

Mark Fisher
fonte
ótima idéia de configurar remote.origin.push para uso de gerrit. Minhas ramificações de recursos locais feature/fix_fubarsão todas apontadas para ramificações upstream mais genéricas como masterou develop, portanto, isso apontaria para a montante incorreta. Como é o seu fluxo local para repos controlados por gerrit?
Spazm
Se você tiver apenas um ramo "alvo" no gerrit, tente simplesmente git config remote.origin.push HEAD:refs/for/master.
Fracz 17/07/2015
2

Eu adicionei as seguintes funções no meu arquivo .bashrc para automatizar essas tarefas. Faz git push / git pull + nome da ramificação atual.

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
}
MichaelMoser
fonte