TL; DR: git branch --set-upstream-to origin/solaris
A resposta para a pergunta que você fez - que vou reformular um pouco como "preciso configurar um upstream" - é: não, você não precisa configurar um upstream.
Se você não possui upstream para a ramificação atual, o Git altera seu comportamento git push
e também em outros comandos.
A história completa do push aqui é longa e chata e remonta à história anterior à versão 1.5 do Git. Para encurtá-lo muito, git push
foi mal implementado. 1 A partir da versão 2.0 do Git, o Git agora possui um botão de configuração escrito, push.default
que agora é o padrão simple
. Para várias versões do Git antes e depois da 2.0, toda vez que você executava git push
, o Git emitia muito ruído tentando convencê-lo a definir push.default
apenas para se git push
calar.
Você não menciona qual versão do Git está executando, nem se configurou push.default
, portanto devemos adivinhar. Meu palpite é que você está usando a versão Git 2 pontos-alguma coisa, e que você definiu push.default
para simple
obtê-lo calar a boca. Precisamente qual versão do Git você tem, e que se qualquer coisa que você tenha push.default
definido para, não importa, devido a que a história longa e chata, mas no final, o fato de que você está recebendo ainda uma outra queixa de Git indica que o Git é configurado para evitar um dos erros do passado.
O que é um upstream?
Um upstream é simplesmente outro nome de filial, geralmente uma filial de rastreamento remoto, associada a uma filial (regular, local).
Cada filial tem a opção de ter um (1) conjunto upstream. Ou seja, todas as ramificações possuem um montante ou um montante não. Nenhuma ramificação pode ter mais de um upstream.
O upstream deve , mas não precisa ser, uma ramificação válida (seja como rastreamento remoto ou local ). Ou seja, se o ramo atual B possuir U a montante , deve funcionar. Se não funcionar - se reclamar que U não existe -, a maioria do Git age como se o upstream não estivesse definido. Alguns comandos, como , mostrarão a configuração upstream, mas marcarão como "ido".origin/B
master
git rev-parse U
git branch -vv
De que serve um montante?
Se você push.default
estiver definido como simple
ou upstream
, a configuração upstream fará git push
, usada sem argumentos adicionais, apenas funcionar.
É isso - é tudo o que faz git push
. Mas isso é bastante significativo, já que git push
é um dos lugares onde um simples erro de digitação causa grandes dores de cabeça.
Se você push.default
estiver definido como nothing
, matching
ou current
, a configuração de um upstream não fará nada git push
.
(Tudo isso assume que sua versão do Git é pelo menos 2.0.)
A montante afeta git fetch
Se você executar git fetch
sem argumentos adicionais, o Git descobrirá de qual remoto buscar, consultando a filial atual da corrente. Se o upstream for um ramo de rastreamento remoto, o Git buscará nesse remoto. (Se o upstream não estiver definido ou for uma ramificação local, o Git tentará buscar origin
.)
A montante afeta git merge
e git rebase
também
Se você executar git merge
ou git rebase
sem argumentos adicionais, o Git usará o upstream da ramificação atual. Portanto, reduz o uso desses dois comandos.
A montante afeta git pull
Você nunca deve usar 2 degit pull
qualquer maneira, mas, se o fizer, git pull
usa a configuração de upstream para descobrir de qual controle remoto buscar e, em seguida, qual ramificação deve ser mesclada ou restaurada. Ou seja, git pull
faz o mesmo que git fetch
- porque na verdade é executado git fetch
- e depois faz o mesmo que git merge
ou git rebase
, porque na verdade executa git merge
ou git rebase
.
(Em geral, você deve executar essas duas etapas manualmente, pelo menos até conhecer o Git bem o suficiente para que, quando uma delas falhar, o que acabará por acontecer, você reconheça o que deu errado e saiba o que fazer a respeito.)
A montante afeta git status
Isso pode realmente ser o mais importante. Depois de definir um conjunto upstream, é git status
possível relatar a diferença entre sua filial atual e a upstream, em termos de confirmações.
Se, como é o caso normal, você estiver na ramificação B
com o upstream definido como e executar , verá imediatamente se você possui confirmações que pode enviar por push e / ou confirmações nas quais pode mesclar ou refazer.origin/B
git status
Isso ocorre porque é git status
executado:
git rev-list --count @{u}..HEAD
: quantos commits você tem B
que não estão ?origin/B
git rev-list --count HEAD..@{u}
: quantos commits você tem que não estão ?origin/B
B
Definir um upstream fornece todas essas coisas.
Como master
já tem um conjunto upstream?
Quando você clona pela primeira vez de algum controle remoto, usando:
$ git clone git://some.host/path/to/repo.git
ou similar, o último passo que o Git executa é, essencialmente git checkout master
,. Isso verifica sua filial local master
- apenas você não tem uma filial local master
.
Por outro lado, você não tem um ramo de rastreamento remoto chamado origin/master
, porque você só clonado lo.
Git adivinha que você deve ter querido dizer: "Faça-me um novo local, master
que aponta para o mesmo cometer tão remota-tracking origin/master
, e, enquanto você está nisso, definir o montante para master
a origin/master
."
Isso acontece para todos os ramos git checkout
que você ainda não possui. O Git cria o ramo e faz com que ele "rastreie" (tenha como montante) o ramo de rastreamento remoto correspondente.
Mas isso não funciona para novas ramificações, ou seja, ramificações sem ramificação de rastreamento remoto ainda .
Se você criar uma nova ramificação:
$ git checkout -b solaris
ainda não existe origin/solaris
. Seu local solaris
não pode rastrear ramificações de rastreamento remoto origin/solaris
porque elas não existem.
Quando você pressiona o novo ramo pela primeira vez:
$ git push origin solaris
que cria solaris
na origin
, e, portanto, também cria origin/solaris
em seu próprio repositório Git. Mas é tarde demais: você já tem um local solaris
que não possui upstream . 3
O Git não deveria apenas definir isso agora como o upstream automaticamente?
Provavelmente. Consulte "Implementado mal" e a nota de rodapé 1. É difícil mudar agora : existem milhões de scripts 4 que usam o Git e alguns podem depender do seu comportamento atual. Alterar o comportamento requer uma nova versão principal, o nag-ware para forçar você a definir algum campo de configuração e assim por diante. Em suma, o Git é vítima de seu próprio sucesso: quaisquer erros que ele possua, atualmente, só podem ser corrigidos se a mudança for na maior parte invisível, claramente muito melhor, ou realizada lentamente ao longo do tempo.
O fato é que não acontece hoje, a menos que você use --set-upstream
ou -u
durante o git push
. É isso que a mensagem está dizendo.
Você não precisa fazer assim. Bem, como observamos acima, você não precisa fazer nada, mas digamos que você queira um upstream. Você já criou ramo solaris
de origin
, através de um impulso mais cedo, e como seus git branch
shows de saída, você já tem origin/solaris
em seu repositório local.
Você simplesmente não o define como o upstream para solaris
.
Para configurá-lo agora, e não durante o primeiro push, use git branch --set-upstream-to
. O --set-upstream-to
subcomando pega o nome de qualquer ramificação existente, como origin/solaris
, e define a ramificação atual upstream para essa outra ramificação.
É isso, é tudo o que faz, mas tem todas as implicações mencionadas acima. Isso significa que você pode simplesmente executar git fetch
, olhar ao redor, executar git merge
ou git rebase
conforme apropriado, fazer novos commits e executar git push
, sem muita confusão.
1 Para ser justo, não estava claro na época que a implementação inicial era propensa a erros. Isso ficou claro quando todos os novos usuários cometiam os mesmos erros todas as vezes. Agora é "menos pobre", o que não quer dizer "ótimo".
2 "Never" é um pouco forte, mas acho que os novatos do Git entendem muito melhor as coisas quando separo as etapas, especialmente quando posso mostrar o que git fetch
realmente fez e elas podem ver o que git merge
ou o que git rebase
fará a seguir.
3 Se você executar o seu primeiro git push
como - git push -u origin solaris
ou seja, se você adicionar o -u
sinalizador - o Git definirá origin/solaris
como o upstream da sua ramificação atual se (e somente se) o envio for bem-sucedido. Então você deve fornecer -u
no primeiro impulso. Na verdade, você pode fornecê-lo em qualquer push posterior, e ele definirá ou alterará o upstream nesse ponto. Mas acho que git branch --set-upstream-to
é mais fácil, se você esqueceu.
4 Medido pelo método Austin Powers / Dr Evil de simplesmente dizer "um MILLLL-YUN", de qualquer maneira.