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

Eu uso o seguinte comando para empurrar para o meu ramo remoto:

git push origin sandbox 

Se eu disser

 git push origin 

Isso empurra mudanças em meus outros ramos também, ou apenas atualiza meu branch atual? Eu tenho três filiais: master , production e sandbox .

A documentação do git push não é muito clara sobre isso, então eu gostaria de esclarecer isso para sempre.

Quais ramificações e controles remotos os seguintes comandos do git push atualizam exatamente?

 git push git push origin 

origin acima é um controle remoto.

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

Você pode controlar o comportamento padrão, definindo push.default em sua configuração git. Da 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 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 : empurre todos os ramos correspondentes

    Todas as filiais com o mesmo nome em ambas as extremidades são consideradas correspondentes.

    Este é o padrão no Git 1.x.

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

  • current : empurra o ramo atual para um ramo de mesmo nome

  • simple : (novo no Git 1.7.11) como upstream, mas se recusa a empurrar se o nome da branch upstream for diferente do local

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

    Isso se tornará o padrão no Git 2.0.

Os modos simples, atual e upstream são para aqueles que querem empurrar uma única ramificação depois de terminar o trabalho, mesmo quando as outras ramificações ainda não estão prontas para serem empurradas

Exemplos de linha de comando:

Para ver a configuração atual:

 git config --global push.default 

Para definir uma nova configuração:

 git config --global push.default current 

git push origin irá empurrar todas as mudanças nas ramificações locais que possuem ramificações remotas correspondentes na origin Como para git push

Funciona como git push , onde é o remoto da ramificação atual (ou origem, se nenhum remoto estiver configurado para a ramificação atual).

Na seção Exemplos da página man do git-push

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

 git config push.default current 

ou se você tem muitos repositorys e quer o mesmo para todos então

 git config --global push.default current 

A corrente nessa configuração significa que, por padrão, você enviará a ramificação atual quando fizer o git push

Outras opções são:

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

ATUALIZAÇÃO – NOVA FORMA DE FAZER ISTO

A partir do Git 1.7.11, faça o seguinte:

 git config --global push.default simple 

Esta é uma nova configuração introduzida que funciona da mesma forma que a atual, e será tornada padrão para git de v 2.0 de acordo com os rumores

Acabei de enviar meu código para um branch e o enviei 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 

Aqui está uma informação muito útil e útil sobre o Git Push : Git Push: apenas a dica

O uso mais comum do git push é empurrar suas mudanças locais para o seu repository upstream público. Assumindo que o upstream é um remoto chamado “origem” (o nome remoto padrão se o seu repository é um clone) e o ramo a ser atualizado para / de é chamado “mestre” (o nome da ramificação padrão), isso é feito com: git push origin master

git push origin enviará alterações de todas as ramificações locais para as ramificações correspondentes do controle remoto de origem.

git push origin master enviará mudanças do ramo mestre local para o ramo mestre remoto.

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

(Março de 2012)
Cuidado: essa política de ” matching ” padrão pode mudar em breve
(às vezes depois de git1.7.10 +) :

Veja ” Por favor, discuta: o que” git push “deve fazer quando você não diz o que empurrar? ”

Na configuração atual (por exemplo, push.default=matching ), o git push sem argumento pressionará todas as ramificações existentes local e remotamente com o mesmo nome .
Isso geralmente é apropriado quando um desenvolvedor envia para seu próprio repository público, mas pode ser confuso se não for perigoso ao usar um repository compartilhado.

A proposta é alterar o padrão para ‘ upstream , isto é, empurrar apenas o branch atual e empurrá-lo para o branch git pull.
Outro candidato é ‘ current ‘; isso envia apenas o ramo atual para o ramo remoto do 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

Discussões relevantes anteriores incluem:

Para participar da discussão, envie suas mensagens para: git@vger.kernel.org

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

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

Vai empurrar o ramo atual para a origem com git pub ou outro repository com git pub repo-name . Saboroso.

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

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

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, a execução de “gpush” ou “gpull” irá empurrar apenas minha ramificação “atualmente em”.

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

 git push origin HEAD 

(tirou daqui )

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 

Em vez de usar aliases, prefiro criar scripts git-XXX para que eu possa controlá-los com mais facilidade (todos os nossos desenvolvedores possuem um diretório controlado por origem em seu caminho para esse tipo de coisa).

Este script (chamado git-setpush ) irá definir o valor de configuração para o valor remote.origin.push para algo que apenas irá empurrar a ramificação 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, como estamos usando o Gerrit , ele define o destino como refs/for/XXX para inserir em uma ramificação de revisão. Também assume origem é seu nome remoto.

Invoque-o depois de verificar um ramo com

 git checkout your-branch git setpush 

Poderia obviamente ser adaptado para também fazer o checkout, mas eu gosto de scripts para fazer uma coisa e fazê-lo bem

Eu adicionei as seguintes funções no meu arquivo .bashrc para automatizar essas tarefas. Ele faz push / git pull + nome do ramo atual.

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