Versão TL; DR: a ramificação de rastreamento remoto origin/master
costumava existir, mas não existe agora, portanto a ramificação local source
está rastreando algo que não existe, o que é suspeito na melhor das hipóteses - significa que um recurso Git diferente não pode fazer nada por você - e Git está avisando sobre isso. Você está se dando muito bem sem que o recurso "rastreamento upstream" funcione conforme o esperado, portanto, é sua decisão alterar alguma coisa.
Para outra opinião sobre as configurações upstream, consulte Por que eu tenho que "git push --set-upstream origin <branch>"?
Esse aviso é uma novidade no Git, aparecendo primeiro no Git 1.8.5. As notas de versão contêm apenas um pequeno item sobre ele:
- "git branch -v -v" (e "git status") não fez distinção entre uma ramificação que não se baseia em nenhuma outra ramificação, uma ramificação que esteja sincronizada com sua ramificação upstream e uma ramificação configurada com uma ramificação upstream ramo que não existe mais.
Para descrever o que isso significa, primeiro você precisa saber sobre "controles remotos", "ramificações de rastreamento remoto" e como o Git lida com "rastrear um upstream". ( Ramificações de rastreamento remoto é um termo terrivelmente defeituoso - comecei a usar nomes de rastreamento remoto , o que acho que é uma pequena melhoria. Abaixo, porém, usarei "ramificação de rastreamento remoto" para garantir a consistência com a documentação do Git. )
Cada "remoto" é simplesmente um nome, como origin
ou octopress
neste caso. O objetivo deles é registrar coisas como o URL completo dos locais dos quais você git fetch
ou git pull
atualiza. Quando você usa o 1 Git, acessa esse controle remoto (usando a URL salva) e traz o conjunto apropriado de atualizações. Ele também registra as atualizações usando "ramificações de rastreamento remoto".git fetch remote,
Um "ramo de rastreamento remoto" (ou nome de rastreamento remoto) é simplesmente uma gravação de um nome de ramo como visto pela última vez em alguns "remotos". Cada controle remoto é um repositório Git, portanto, possui ramificações. As ramificações na "origem" remota são registradas no seu repositório local em remotes/origin/
. O texto que mostrou diz que há um ramo chamado source
em origin
e ramos chamado 2.1
, linklog
e assim por diante no octopress
.
(Uma ramificação "normal" ou "local", é claro, é apenas um nome de ramificação que você criou em seu próprio repositório.)
Por fim, você pode configurar uma ramificação (local) para "rastrear" uma "ramificação de rastreamento remoto". Depois que o ramo local L
estiver definido para rastrear o ramo de rastreamento remoto R
, o Git chamará R
seu "upstream" e informará se você está "à frente" e / ou "atrás" do upstream (em termos de confirmações). É normal (mesmo recomendável) que a filial local e as ramificações de rastreamento remoto usem o mesmo nome (exceto a parte do prefixo remoto), como source
e origin/source
, mas isso não é realmente necessário.
E neste caso, isso não está acontecendo. Você tem uma filial local que source
rastreia uma filial de rastreamento remoto origin/master
.
Você não precisa saber a mecânica exata de como o Git configura uma ramificação local para rastrear uma ramificação remota, mas elas são relevantes abaixo, então mostrarei como isso funciona. Começamos com o nome da sua filial local source
,. Existem duas entradas de configuração usando esse nome, ortografado branch.source.remote
e branch.source.merge
. A partir da saída que você mostrou, é claro que ambos estão definidos, para que você veja o seguinte se executar os comandos fornecidos:
$ git config --get branch.source.remote
origin
$ git config --get branch.source.merge
refs/heads/master
Juntando isso, 2 isso indica ao Git que seu ramo source
rastreia o seu "ramo de rastreamento remoto" origin/master
,.
Mas agora observe a saída de git branch -a
, que mostra todos os nomes de ramificações de rastreamento local e remoto em seu repositório. Os nomes de rastreamento remoto estão listados em remotes/
... e não háremotes/origin/master
. Presumivelmente, houve uma vez, mas agora se foi.
O Git está lhe dizendo que você pode remover as informações de rastreamento --unset-upstream
. Isso limpará ambos branch.source.origin
e branch.source.merge
, e interromperá o aviso.
Parece bastante provável que o que você deseja, porém, seja mudar de rastreamento origin/master
, para rastrear outra coisa: provavelmente origin/source
, mas talvez um dos octopress/
nomes.
Você pode fazer isso com git branch --set-upstream-to
, 3 por exemplo:
$ git branch --set-upstream-to=origin/source
(supondo que você ainda esteja na "origem" da ramificação, e esse origin/source
é o fluxo que você deseja - não há como eu dizer qual, se houver, você realmente deseja).
(Veja também Como você faz com que uma ramificação Git existente rastreie uma ramificação remota? )
Eu acho que o jeito que você chegou aqui é que, quando você fez o primeiro git clone
, a coisa da qual você clonou tinha um ramo master
. Você também tinha uma ramificação master
que foi configurada para rastrear origin/master
(esta é uma configuração normal e padrão para o git). Isso significava que você tinha branch.master.remote
e branch.master.merge
definia, para origin
e refs/heads/master
. Mas então o seu origin
controle remoto mudou seu nome de master
para source
. Para corresponder, acredito que você também alterou seu nome local de master
para source
. Isso alterou os nomes das suas configurações, de branch.master.remote
para branch.source.remote
e de branch.master.merge
para branch.source.merge
... mas deixou os valores antigos , branch.source.merge
agora estava errado.
Foi nesse ponto que a ligação "upstream" quebrou, mas nas versões Git anteriores à 1.8.5, o Git nunca percebeu a configuração quebrada. Agora que você tem 1.8.5, está apontando isso.
Isso cobre a maioria das perguntas, mas não a pergunta "preciso corrigir isso". É provável que você tenha trabalhado em torno do quebrantamento há anos, fazendo (por exemplo, ). Se você continuar fazendo isso, ele continuará solucionando o problema - então, não, você não precisará corrigi-lo. Se desejar, você pode remover o montante e interromper as reclamações e não ter uma filial local marcada como tendogit pull remote branch
git pull origin source
--unset-upstream
source
qualquer montante.
O ponto de ter um upstream é tornar várias operações mais convenientes. Por exemplo, git fetch
seguido por git merge
geralmente "fará a coisa certa" se o upstream estiver definido corretamente egit status
depois git fetch
informará se o seu repo corresponde ao upstream, para esse ramo.
Se você quiser a conveniência, redefina o upstream.
1git pull
usa git fetch
e, a partir do Git 1.8.4, isso (finalmente!) Também atualiza as informações de "filial de rastreamento remoto". Nas versões mais antigas do Git, as atualizações não eram registradas em ramificações de rastreamento remoto git pull
, apenas comgit fetch
. Como seu Git deve ter pelo menos a versão 1.8.5, isso não é um problema para você.
2 Bem, isso mais uma linha de configuração que eu estou deliberadamente ignorando que é encontrada em remote.origin.fetch
. O Git precisa mapear o nome "mesclar" para descobrir que o nome local completo da ramificação remota é refs/remotes/origin/master
. O mapeamento quase sempre funciona assim, portanto, é previsível que isso master
ocorra origin/master
.
3 Ou com git config
. Se você apenas deseja configurar o upstream para origin/source
a única parte que precisa ser alterada branch.source.merge
, e o git config branch.source.merge refs/heads/source
faria. Mas --set-upstream-to
diz o que você quer fazer, em vez de fazê-lo manualmente, por isso é uma "maneira melhor".