Como você envia apenas um único ramo Git (e nenhum outro ramo)?

247

Estou trabalhando em um repositório git local. Existem dois ramos, mastere feature_x.

Quero enviar feature_xpara o repositório remoto, mas não quero enviar as alterações na masterramificação.

Um git push origin feature_xda minha feature_xfilial (a feature_xfilial já existe no remoto) funcionará?

Eu não quero testar isso na minha caixa, porque não posso pressionar para dominar agora.

Rafael Mueller
fonte
Dê uma olhada aqui: remoto e aqui: empurre um ramo para o github Parece que funcionaria.
al.

Respostas:

376

sim, faça o seguinte

git checkout feature_x
git push origin feature_x
cpjolicoeur
fonte
54
Com o git moderno, você pode simplesmente "git push origin HEAD", ou mesmo "git push HEAD" para enviar apenas o ramo atualmente com check-out.
Jakub Narębski
2
É necessário fazer o checkout para feature_x?
hd.
5
Sim, porque se você estiver no mestre, ele tentará enviar o ramo mestre local para o ramo feature_x remoto. para não ter de fazer o checkout primeiro você teria que fazer "git feature_x push origin: feature_x"
cpjolicoeur
1
@ cpjolicoeur eu vi em outras perguntas (por exemplo: aqui ) elas estão fazendo git push -u origin <branch-name>. No entanto, você não mencionou. Isso é necessário ?
Riroo
3
@miss_R a -uopção em um git-pushcomando definirá a referência upstream para rastrear o ramo que acabou de ser enviado. Isso fará com que coisas como git-pullesse ramo no futuro já saibam de qual ramo extrair sem especificá-lo. Não é necessário, como opção, enviar por push uma única ramificação, mas é amplamente usado porque muitas pessoas desejam fazer com que a filial local rastreie a ramificação remota que eles estão enviando.
Cpjolicoeur 11/01
74

Por padrão, git pushatualiza todas as ramificações remotas. Mas você pode configurar o git para atualizar apenas o ramo atual para o upstream.

git config push.default upstream

Isso significa que o git atualizará apenas a ramificação atual (registrada) quando você fizer o git push.

Outras opções válidas são:

  • nothing: Não envie nada (erro), a menos que um refspec seja fornecido explicitamente . Isso se destina principalmente a pessoas que desejam evitar erros sempre sendo explícitos.
  • matching: Empurre todos os ramos com o mesmo nome nas duas extremidades. (opção padrão anterior à versão 1.7.11)
  • upstream: Envie a ramificação atual para a ramificação upstream. Este modo só faz sentido se você estiver empurrando para o mesmo repositório do qual normalmente retiraria (ou seja, fluxo de trabalho central ). Não é necessário ter o mesmo nome para filial local e remota.
  • tracking: Descontinuado, use em upstreamvez disso.
  • current: Envie a ramificação atual para a ramificação remota com o mesmo nome na extremidade de recebimento. Funciona em fluxos de trabalho centrais e não centrais.
  • simple: [disponível desde a versão 1.7.11] no fluxo de trabalho centralizado, trabalhe como upstreamuma segurança adicional para se recusar a enviar por push se o nome da filial upstream for diferente do local. Ao empurrar para um controle remoto diferente do que você normalmente puxa, trabalhe como current. Esta é a opção mais segura e é adequada para iniciantes. Este modo se tornou o padrão no Git 2.0.
Karthik Bose
fonte
2
Obrigado, currentera o que eu estava procurando, por padrão git pushno fooramo irá empurrá-lo para o origin/fooramo.
Dorian
@Dorian obrigado, concordo que currentfaz mais sentido como padrão.
Zoltán
@Dorian, @ Zoltán - sinto que simplefaz mais sentido como padrão. Atualizei a resposta com 'quando usar o quê'. Pls dê uma olhada.
Karthik Bose
1
Nota: desde a versão 2 do git, o valor padrão mudou para simple.
Danijel
8

Atualização secundária sobre a resposta do Karthik Bose - você pode configurar o git globalmente, para afetar todos os seus espaços de trabalho a se comportarem dessa maneira:

git config --global push.default upstream
Bhaskar
fonte
não era a montante reconhecido como uma configuração válida para mim, tive que colocar 'atual' em vez
gafanhoto
-2

Então, digamos que você tenha uma filial local foo, uma origem chamada remota e uma origem / mestre remota.

Para enviar o conteúdo de foo para origin / master, primeiro é necessário configurar o upstream:

git checkout foo
git branch -u origin/master

Em seguida, você pode enviar para esse ramo usando:

git push origin HEAD:master

No último comando, você pode adicionar --force para substituir todo o histórico de origem / mestre pelo do foo.

CodeKid
fonte