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".
a resposta de torek provavelmente é perfeita, mas eu queria que o registro mencionasse outro caso diferente do descrito na pergunta original, mas o mesmo erro pode aparecer (pois pode ajudar outras pessoas com problemas semelhantes):
Eu criei um repo vazio (novo) usando
git init --bare
em um dos meus servidores. Então eu o coloqueigit clone
em um espaço de trabalho local no meu PC.Depois de confirmar uma única versão no repositório local, recebi esse erro depois de ligar
git status
.Após a resposta da torek, entendo que o que aconteceu foi que o primeiro commit no repositório de diretório de trabalho local criou uma ramificação "master". Mas no repositório remoto (no servidor) nunca havia nada, portanto não havia nem mesmo um ramo "mestre" (controles remotos / origem / mestre).
Depois de executar a
git push origin master
partir do repositório local, o repositório remoto finalmente teve uma ramificação principal. Isso parou o erro de aparecer.Então, para concluir - pode-se obter esse erro para um novo repo remoto com zero confirmações, uma vez que não possui ramificação, incluindo "master".
fonte
On branch source Your branch is based on 'origin/master', but the upstream is gone. (use "git branch --unset-upstream" to fixup)
e, embora subjetivo, é mais provável que seja causado pela clonagem de um repositório vazio tão bom que você terá uma resposta alternativa aqui.Isso pode resolver seu problema.
depois de fazer alterações, você pode confirmar e depois
espero que funcione para você.
obrigado
fonte
Para mim,
.git/refs/origin/master
ficou corrompido.Fiz o seguinte, que corrigiu o problema para mim.
fonte
Na verdade, a Torek já lhe disse como usar as ferramentas muito melhor do que eu seria capaz de fazer. No entanto, neste caso, acho importante ressaltar algo peculiar se você seguir as diretrizes em http://octopress.org/docs/deploying/github/ . Ou seja, você terá vários repositórios do github em sua configuração. Primeiro, aquele com todo o código-fonte do seu site, digamos o diretório
$WEBSITE
, e depois aquele com apenas os arquivos estáticos gerados residindo$WEBSITE/_deploy
. O engraçado da configuração é que há um.gitignore
arquivo no$WEBSITE
diretório para que essa configuração realmente funcione.Chega de introdução. Nesse caso, o erro também pode vir do repositório em
_deploy
.Em
.git/config
normalmente você vai precisar encontrar algo como isto:Mas no seu caso, o mestre da filial não possui um controle remoto.
Que você pode resolver:
Portanto, tudo está como lhe foi dito, mas talvez seja importante ressaltar que isso pode muito bem dizer respeito ao
_deploy
diretório, e não à raiz do seu site.PS: Pode valer a pena usar um shell como
zsh
umgit
plug-in para não ser mordido por essa coisa no futuro. Ele mostrará imediatamente que se_deploy
refere a um repositório diferente.fonte
Eu tive essa pergunta duas vezes e sempre foi causada pela corrupção do arquivo de cache do git na minha filial local. Corrigi-o escrevendo o hash de confirmação ausente nesse arquivo. Eu obtive o hash de confirmação correto do servidor e executei o seguinte comando localmente:
fonte
Problema: sua filial é baseada em 'origem / mestre', mas o upstream desapareceu.
Solução: git branch --unset-upstream
fonte
exclua sua filial local seguindo o comando
você também poderia fazer
que basicamente força uma exclusão (mesmo que o local não seja mesclado à origem)
fonte