Você me pediu para puxar sem me dizer com qual ramo deseja mesclar

125

TL; DR: Eu tenho um ramo "rastreado" que não consigo puxar.

Então, aqui estou eu no "bucket-4":

$ git branch -v
  bucket-1       410f7b5 * gh-53 * gh-48 * "Share App"
  bucket-2       7ed70a2 * upgrade to SOLR 3.3.0
  bucket-3       400ffe4 * emergency fix prod issue
* bucket-4       64c2414 Merge branch 'bucket-3' into bucket-4
  master         8dc4854 [ahead 1] * gh-73

Gostaria de extrair alterações do meu controle remoto:

$ git pull

You asked me to pull without telling me which branch you
want to merge with, and 'branch.bucket-4.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "bucket-4"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

Hmm, estranho, eu pensei que já tinha adicionado "bucket-4" como um ramo de rastreamento. Vamos ver:

$ git remote show origin
* remote origin
  Fetch URL: [email protected]:abcd/main.git
  Push  URL: [email protected]:abcd/main.git
  HEAD branch (remote HEAD is ambiguous, may be one of the following):
    bucket-3
    master
  Remote branches:
    bucket-1       tracked
    bucket-2       tracked
    bucket-3       tracked
    bucket-4       tracked
    master         tracked
  Local branches configured for 'git pull':
    bucket-1       merges with remote bucket-1
    bucket-2       merges with remote bucket-2
    bucket-3       merges with remote bucket-3
    master         merges with remote master
  Local refs configured for 'git push':
    bucket-1       pushes to bucket-1       (up to date)
    bucket-2       pushes to bucket-2       (up to date)
    bucket-3       pushes to bucket-3       (up to date)
    bucket-4       pushes to bucket-4       (local out of date)
    master         pushes to master         (fast-forwardable)

De fato, o bucket-4 é marcado como "rastreado", mas de alguma forma está configurado para push, mas não pull.

Observando meu .git/configarquivo, vejo que tenho entradas "remotas" e "mescladas" para a maioria das minhas ramificações, mas não para o bucket-4. Como é considerado "rastreado" sem isso?

[remote "origin"]
    url = [email protected]:abcd/main.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "rel-2011-07-07"]
    remote = origin
    merge = refs/heads/rel-2011-07-07
[branch "bucket-1"]
    remote = origin
    merge = refs/heads/bucket-1
[branch "bucket-2"]
    remote = origin
    merge = refs/heads/bucket-2
[branch]
    autosetupmerge = true
[branch "bucket-3"]
    remote = origin
    merge = refs/heads/bucket-3

Vejo que a solução provável aqui é adicionar remote/mergeentradas para o bucket-4 no meu arquivo de configuração. Mas como é considerado "rastreado" sem isso? O bucket-4 foi criado localmente e enviado ao servidor a partir deste repositório, então suspeito que, de alguma forma, não configurei o rastreamento corretamente para essa ramificação.

Existe alguma configuração que eu possa adicionar para que todas as filiais locais rastreiem seus controles remotos corretamente no futuro?

George Armhold
fonte
2
Esta pergunta me apontou na direção certa, eu apenas tive que adicionar uma entrada no meu arquivo .git / config para o ramo que eu estava tentando puxar, então funcionou bem.
Sr. Bungle
Yup mim também, ea maneira de fazer isso é como Mark Longair descrito abaixo com git branch --set-a montante balde-4 origem / bucket-4
Jonathon Horsman

Respostas:

191

Diz bucket-4 pushes to bucket-4apenas porque o padrão ao enviar um ramo é enviá-lo para outro com um nome correspondente no controle remoto. (Observe que esse ainda é o padrão, mesmo que a filial local esteja rastreando uma filial de rastreamento remoto e a filial de rastreamento remoto corresponda a uma filial com um nome diferente no repositório remoto.)

A maneira mais simples para configurar a associação entre o seu bucket-4e bucket-4no originé ter certeza de que a próxima vez que você empurra, você faz:

git push -u origin bucket-4

Como alternativa, você pode fazer:

git branch --set-upstream-to origin/bucket-4

Para responder diretamente a algumas de suas perguntas:

Como é considerado "rastreado" sem isso?

Nesse caso, não está - não está rastreando a ramificação de rastreamento remoto em nenhum sentido, se não houver branch.bucket-4.mergeou branch.bucket-4.remotena sua configuração do git. A saída de git remote show originapenas mostra onde a ramificação seria enviada por padrão.

Existe alguma configuração que eu possa adicionar para que todas as filiais locais rastreiem seus controles remotos corretamente no futuro?

Eu não acho que existe. Quando você criou bucket-4localmente, como presumo que aconteceu, o ramo de rastreamento remoto não existia, portanto não pode ser configurado nesse ponto - seria um comportamento padrão muito confuso. Você só precisa se lembrar de adicionar -uao seu primeiro git pushdessa ramificação seu repositório upstream.

Espero que isso ajude.

Mark Longair
fonte
7
git branch --set-upstreamfuncionou perfeitamente para mim antes de fazer o pull
ohaal 30/10/12
git branch --set-a montante balde-4 origem / bucket-4 funcionou para mim :-)
Aliza
E se você não quiser empurrar? Eu tenho esse mesmo problema, mas não quero enviar do repositório em que esse problema ocorre. Acabei de trocar as origens remotas e quero baixar o HEAD mais recente para o ramo que aparentemente não é mais rastreado (mesmo que tenha sido rastreado antes de trocar a origem remota). No final, apaguei o clone problemático e clonei novamente a partir da nova origem.
geoidesic
1
Na verdade, ao tentar, git --set-upstream <branch> origin/<branch>você recebe um erro, pois o sinalizador está obsoleto. Recomenda-se o uso git branch --track origin/<branch>ou --set-upstream-tocomo a segunda resposta sugerida. Acho que a resposta pode ser atualizada, @ MarkLongair?
AymDev
Obrigado pela sugestão, @AymDev - fiz essa alteração.
Mark Longair
6

git branch --set-upstream <branch> origin/<branch> foi preterido pelo menos a partir de 1.8.2.3 (minha versão).

Use em git branch --set-upstream-to=origin/<branch> <branch>vez disso.

d_roge
fonte
2
Você queria que isso fosse um comentário sobre a resposta de Mark ? Além disso, foi realmente preterido no Git versão 1.8.0 .