Versão TL; DR: a ramificação de rastreamento remoto origin/mastercostumava existir, mas não existe agora, portanto a ramificação local sourceestá 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 originou octopressneste caso. O objetivo deles é registrar coisas como o URL completo dos locais dos quais você git fetchou git pullatualiza. 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 sourceem origine ramos chamado 2.1, linkloge 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 Lestiver definido para rastrear o ramo de rastreamento remoto R, o Git chamará Rseu "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 sourcee origin/source, mas isso não é realmente necessário.
E neste caso, isso não está acontecendo. Você tem uma filial local que sourcerastreia 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.remotee 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 sourcerastreia 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.origine 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 masterque foi configurada para rastrear origin/master(esta é uma configuração normal e padrão para o git). Isso significava que você tinha branch.master.remotee branch.master.mergedefinia, para origine refs/heads/master. Mas então o seu origincontrole remoto mudou seu nome de masterpara source. Para corresponder, acredito que você também alterou seu nome local de masterpara source. Isso alterou os nomes das suas configurações, de branch.master.remotepara branch.source.remotee de branch.master.mergepara branch.source.merge... mas deixou os valores antigos , branch.source.mergeagora 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 branchgit pull origin source--unset-upstreamsource qualquer montante.
O ponto de ter um upstream é tornar várias operações mais convenientes. Por exemplo, git fetchseguido por git mergegeralmente "fará a coisa certa" se o upstream estiver definido corretamente egit status depois git fetchinformará se o seu repo corresponde ao upstream, para esse ramo.
Se você quiser a conveniência, redefina o upstream.
1git pull usa git fetche, 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 masterocorra origin/master.
3 Ou com git config. Se você apenas deseja configurar o upstream para origin/sourcea única parte que precisa ser alterada branch.source.merge, e o git config branch.source.merge refs/heads/source
faria. Mas --set-upstream-todiz o que você quer fazer, em vez de fazê-lo manualmente, por isso é uma "maneira melhor".