git: Seu ramo está à frente por X confirma

379

Como isso realmente acontece?

Atualmente, estou trabalhando em um repositório sozinho, então este é o meu fluxo de trabalho:

  1. Alterar arquivos
  2. Confirmar
  3. Repita 1-2 até ficar satisfeito
  4. Pressione para dominar

Então, quando eu faço um git status, diz-me que meu ramo está à frente de confirmações de X (presumivelmente o mesmo número de confirmações que eu fiz). É porque, quando você pressiona o código, ele não atualiza seus arquivos armazenados em cache localmente (nas pastas .git)? git pullparece 'consertar' essa mensagem estranha, mas ainda estou curioso por que isso acontece, talvez eu esteja usando o git errado?


incluindo qual ramificação é impressa na mensagem

Minha filial local está à frente do mestre

onde você empurra / puxa o ramo atual

Estou migrando para o GitHub e acessando o computador em que estou trabalhando naquele momento, minha cópia local está sempre atualizada, pois sou a única a trabalhar nela.

na verdade, não verifica o repositório remoto

Foi isso o que pensei, pensei em garantir que meu entendimento estivesse correto.

você está passando alguns argumentos extras para ele?

Não os que eu posso ver, talvez haja alguma configuração engraçada acontecendo do meu lado?

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
SeanJA
fonte
Como você está fazendo pushe quais são as definições de configuração remota e de ramificação?
CB Bailey
2
na verdade, ele não verifica o repositório remoto, você precisa fazer um git buscar as informações mais recentes no repositório remoto depois de executar o push, isso atualizará o ramo "remoto" local que ele usa para rastrear.
Sekhat
2
@ Sekhat: Enquanto git statusnão verifica o repositório remoto, git pullfaz. Se você tiver uma ramificação de rastreamento para um repositório para o qual você envia por push, git pushatualizará sua ramificação de rastreamento local para refletir o novo estado da ramificação remota se o envio for bem-sucedido. É por isso que perguntei sobre a configuração do solicitante, porque se isso não estiver acontecendo corretamente, provavelmente haverá um erro de configuração.
CB Bailey
git status? mesmo? o meu git statusnunca me diz a que distância meu ramo está .. você está passando alguns argumentos extras para ele?
hasen
4
@hasen j: git statusnão vai ao repositório remoto para verificar se o ramo remoto foi atualizado. Indica a que distância sua filial local é comparada à filial de rastreamento remoto armazenada localmente . O problema é que um normal git push(assim como buscar e puxar) deve atualizar a ramificação de rastreamento remoto e, para o solicitante, isso não parece estar funcionando. Para entender por que precisamos ver a forma exata git pushdisso sendo usada e a configuração do repositório local, mas como o solicitante já aceitou uma resposta, não vejo isso acontecendo agora.
CB Bailey

Respostas:

508

Se você receber esta mensagem depois de fazer a git pull remote branch, tente segui-la com a git fetch. (Opcionalmente, execute git fetch -pa remoção de ramificações excluídas do repositório)

A busca parece atualizar a representação local da ramificação remota, o que não acontece necessariamente quando você faz um git pull remote branch.

Rico
fonte
11
Bravo. Essa foi realmente a questão. Comecei criando um repositório no código do google. Depois, clonei esse repositório no meu laptop e trabalho lá e pressiono as alterações laptop => code.google. Eu costumava receber essa mensagem no meu servidor, onde criava um clone do repositório de código code.google e costumava fazer as alterações. Eu acho que a busca é necessária para atualizar o banco de dados local.
Rjha94 27/08
2
Tivemos o mesmo problema aqui porque outro ramo (A) apontou para o mesmo commitid de master. Puxar A e depois puxar o mestre resultou nessa mesma situação. Quando o git puxou A, o commitid foi atualizado para o último, portanto, o pull master não tem nada para puxar; portanto, o git não atualizou o último commitid principal e estava avisando sobre estar "à frente do master".
Uberto
8
Obrigado, embora eu tenha notado uma coisa estranha. "git fetch origin master" não ajuda, mas "git fetch origin" ajuda. Estou no ramo principal, portanto, não tenho certeza de como "git fetch origin" faria algo diferente no contexto.
Parag
2
@Parag, veja stackoverflow.com/questions/26350876/… para obter uma explicação das diferenças entre esses dois comandos e como, talvez, modificar o arquivo de configuração para alterar o comportamento, para que o git fetch branch branch também atualize a referência de controle remoto, O git_status não informa 'adiante por'.
Anatortoise House
2
@Parag, também stackoverflow.com/questions/7365415/… resposta discute os detalhes de ORIG_HEAD e FETCH_HEAD saindo de sincronia, causando o aviso de status e possíveis correções no arquivo de configuração.
Anatortoise Casa
138

Usar

git pull --rebase

A opção --rebase significa que o git afastará seu commit local, sincronizará com o controle remoto e tentará aplicar seus commit no novo estado.

Marian Zburlea
fonte
3
Uma maneira realmente boa de evitar fusões inúteis e ter uma árvore mais limpa na origem!
Hatef 27/07/2015
11
Eu tentei este comando, mas ainda tenho o mesmo problema ...$ git pull --rebase Current branch xyz is up to date. $ git status On branch xyz Your branch is ahead of 'origin/xyz' by 6 commits. (use "git push" to publish your local commits) nothing to commit, working tree clean
bbh
4
Esta resposta está errada: se você a usar sem entender a situação, estará produzindo problemas para os próximos tempos (histórico reescrito!). Se você entender a situação, essa não será a solução. Por favor, pense antes de digitar ao usar gite nunca reescreva sem pensar a história!
cmaster - reinstate monica
80

Use estes 3 comandos simples

Etapa 1 :git checkout <branch_name>

Etapa 2 :git pull -s recursive -X theirs

Etapa 3 :git reset --hard origin/<branch_name>

Mais detalhes: https://stackoverflow.com/a/39698570/2439715

Aproveitar.

Abhishek Goel
fonte
3
Esta é a única resposta que realmente corrigiu o problema para mim. Os comandos acima estranhamente o derrubaram de 12 para 7 commits e isso finalmente os removeu
Ieuan 22/02
11
Concordo que essa seja a única coisa que funcionou para mim. Estou convencido de que o GIT tem distúrbios de personalidade múltipla às vezes.
ksed
11
Como @leuan, nada além de git reset --hard origin/masteresclareceu para mim.
Dave Land
Mesmo aqui, este é o único passo que funcionou para mim
Shard_MW
51

Acho que você está interpretando mal a mensagem - seu ramo não está à frente master, está master . É antes de origin/master, que é um ramo de monitoramento remoto que registra o estado do repositório remoto de seu último push, pullou fetch. Está dizendo exatamente o que você fez; você ficou à frente do controle remoto e está lembrando que você deve empurrar.

Josh Lee
fonte
22
Isso é realmente depois que eu empurrei. Eu tive que puxar (ou possivelmente buscar?) Para que ele não recebesse essa mensagem.
SeanJA
26

Alguém disse que você pode estar interpretando mal sua mensagem, não está. Esse problema realmente tem a ver com seu <project>/.git/configarquivo. Nele haverá uma seção semelhante a esta:

[remote "origin"]
    url = <url>
    fetch = +refs/heads/*:refs/remotes/origin/*

Se você remover a linha de busca do arquivo .git / config do seu projeto, interromperá a opção "Sua ramificação está à frente de 'origem / mestre' N confirmação ". aborrecimento de ocorrer.

Ou assim espero. :)

Código Falso Macaco Rashid
fonte
Vou verificar isso na próxima vez que vir a ahead by x commitsmensagem. Não vejo a mensagem há algum tempo.
SeanJA
Não vejo a mensagem há algum tempo. Eu acho que é porque eu comecei a criar o repo git localmente, em seguida, empurrando-o para um repositório remoto em vez do contrário ...
SeanJA
Eu tentei isso, mas o eGit no Eclipse começou a aparecer com "erro interno" quando tentei confirmar. O próprio Git parecia funcionar bem, no entanto.
user4815162342
18
O que essa linha faz? e o que estou perdendo ao removê-lo? (além do aborrecimento)
John Mee
11
Isso funcionou, mas é mais como suprimir o erro. Adicione a linha de volta e você começará a receber um aviso novamente.
amigos estão dizendo sobre krishna pandey
15

Eu tive esse problema no meu servidor de palco, onde apenas puxa. E o hard reset ajudou-me a limpar o HEAD da mesma forma que o controle remoto.

git reset --hard origin/master

Então agora eu tenho novamente:

On branch master
Your branch is up-to-date with 'origin/master'.
Anatolii Pazhyn
fonte
Eu tentei pela primeira vez sem a bandeira --hard e funcionou!
precisa saber é o seguinte
12

Isso funcionou para mim

git reset --hard origin/master

A saída deve se parecer com

On branch dev HEAD is now at ae1xc41z Last commit message

Али Палитаев
fonte
11

No meu caso, foi porque mudei para o master usando

 git checkout -B master

Apenas para puxar a nova versão em vez de

 git checkout master

O primeiro comando redefine o chefe do mestre para minhas últimas confirmações

eu usei

git reset --hard origin/master

Para consertar isso

AxCoder
fonte
9

Passei por todas as soluções desta página e, felizmente, @ anatolii-pazhyn comentou porque sua solução foi a que funcionou. Infelizmente, não tenho reputação suficiente para votar novamente, mas recomendo tentar sua solução primeiro:

git reset --hard origin/master

O que me deu:

HEAD is now at 900000b Comment from my last git commit here

Eu também recomendo:

git rev-list origin..HEAD
# to see if the local repository is ahead, push needed

git rev-list HEAD..origin
# to see if the local repository is behind, pull needed

Você também pode usar:

git rev-list --count --left-right origin/master...HEAD
# if you have numbers for both, then the two repositories have diverged

Boa sorte

Ryan Erwin
fonte
4

Eu tive esse mesmo problema em uma máquina Windows. Quando eu executava um git pull origin mastercomando, recebia o aviso "à frente de 'origem / mestre' por X confirma". Descobri que se eu executasse git pull origine NÃO especificasse a ramificação, não receberia mais o aviso.

The Code Father
fonte
Eu acredito que isso efetivamente acontece git fetchnos bastidores.
Brian Peterson
"git fetch" não resolveu meu problema, isso resolveu. Eu recebi uma lista de ramificações adicionadas recentemente e esta mensagem "Você pediu para extrair do 'upstream' remoto, mas não especificou uma ramificação. Como esse não é o controle remoto configurado padrão para sua ramificação atual, você deve especificar uma ramificação no comando linha." e o próximo comando "status git" não mostrou o aviso.
precisa
2

Apenas lembra as diferenças entre o ramo atual e o ramo que faz a trilha atual. Forneça mais informações, incluindo o ramo impresso na mensagem e onde você pressiona / puxa o ramo atual.

wRAR
fonte
2

Embora essa pergunta seja um pouco antiga ... eu estava em uma situação semelhante e minha resposta aqui me ajudou a corrigir um problema semelhante que tive

Primeira tentativa com push -fou forçar a opção

Se isso não funcionar, é possível que (como no meu caso) os repositórios remotos (ou melhor, as referências aos repositórios remotos que aparecem git remote -v) possam não estar sendo atualizados.

O resultado acima de seu envio sincronizar seu local / filial com seu remoto / filial, no entanto, o cache em seu repositório local ainda mostra confirmação anterior (de local / filial ... desde que apenas uma confirmação única tenha sido enviada) como HEAD.

Para confirmar o clone acima, repo em um local diferente e tente comparar o HEAD local / ramo e o HEAD remoto / ramo. Se os dois são iguais, provavelmente você está enfrentando o problema que eu fiz.

Solução:

$ git remote -v
github  [email protected]:schacon/hw.git (fetch)
github  [email protected]:schacon/hw.git (push)
$ git remote add origin git://github.com/pjhyett/hw.git
$ git remote -v
github  [email protected]:schacon/hw.git (fetch)
github  [email protected]:schacon/hw.git (push)
origin  git://github.com/pjhyett/hw.git (fetch)
origin  git://github.com/pjhyett/hw.git (push)
$ git remote rm origin
$ git remote -v
github  [email protected]:schacon/hw.git (fetch)
github  [email protected]:schacon/hw.git (push)

Agora faça o push -fseguinte

git push -f github master ### Observe que seu comando não possui originmais!

Faça um git pullagora git pull github master

em git statusreceber

# On branch master

nothing to commit (working directory clean)

Espero que isso seja útil para alguém, pois o número de visualizações é tão alto que a busca por esse erro quase sempre lista esse tópico no topo

Consulte também gitref para obter detalhes

Vikram
fonte
2

Eu realmente tive isso acontecendo quando eu estava fazendo uma troca / verificação com o TortiseGIT.

Meu problema era que eu criei a ramificação com base em outra ramificação local. Ele criou uma entrada de "mesclagem" /.git/configque se parecia com isso:

[branch "web"]
    merge = refs/heads/develop
    remote = gitserver

Onde, sempre que eu mudei para o ramo "web", estava me dizendo que eu tinha mais de 100 confirmações antes do desenvolvimento. Bem, eu não estava mais me comprometendo a me desenvolver, e isso era verdade. Consegui simplesmente remover esta entrada e parece estar funcionando conforme o esperado. Ele está rastreando corretamente com o árbitro remoto em vez de reclamar por estar atrás do ramo de desenvolvimento.

Como Vikram disse, esse encadeamento de estouro de pilha é o principal resultado do Google ao procurar esse problema, então pensei em compartilhar minha situação e solução.

Dustin Graham
fonte
2

Gostaria de reiterar o mesmo que mencionado por @Marian Zburlia acima. Funcionou para mim e sugeriria o mesmo para os outros.

git pull origin develop

deve ser seguido por $ git pull --rebase.

Isso removerá os comentários que aparecerem $ git statusapós a última atração.

Partho Chatterjee
fonte
2

git fetch vai resolver isso para você

Se meu entendimento estiver correto, seu local (em cache) origin/masterestá desatualizado. Este comando atualizará o estado do repositório do servidor.

Guillaume Racicot
fonte
11
Por favor, adicione algumas descrições
Mathews Sunny
2

Então, quando eu faço um status de git, ele me diz que meu ramo está à frente de confirmações de X (presumivelmente o mesmo número de confirmações que eu fiz ).

Minha experiência é em um ambiente de equipe com muitos ramos. Trabalhamos em nossas próprias filiais de recursos (em clones locais) e foi uma daquelas que git statusmostraram que eu tinha 11 comprometimentos à frente. Minha suposição de trabalho, como o autor da pergunta, era que +11 era de meus próprios commits .

Aconteceu que eu havia retirado as alterações do developramo comum para o meu recurso muitas semanas antes - mas esqueci! Quando revisitei minha filial local hoje e fiz um git pull origin developnúmero saltou para +41 confirma à frente. Muito trabalho foi feito develope, portanto, meu ramo de recursos local estava ainda mais à frente do ramo de recursos no originrepositório.

Portanto, se você receber essa mensagem, lembre-se de quaisquer puxões / mesclagens que você possa ter feito de outros ramos (de sua preferência ou de outros) aos quais tenha acesso. A mensagem apenas indica que você precisa que git pushessas pullalterações sejam retornadas ao originrepositório ('ramo de rastreamento') do repositório local para sincronizar as coisas.

FPGA-guy
fonte
1

As respostas que sugerem git pullou git fetchestão corretas.
A mensagem é gerada quando git statusvê uma diferença entre .git/FETCH_HEADe .git/refs/remotes/<repository>/<branch>(por exemplo .git/refs/remotes/origin/master).

O último arquivo registra o HEAD da última busca (para o repositório / filial). Doing git fetchatualiza os dois arquivos no HEAD atual da ramificação.
Obviamente, se não houver nada para buscar (porque o repositório local já está atualizado), .git/FETCH_HEADisso não será alterado.

NoBrassRing
fonte
Este não parece ser o meu caso: .git/FETCH_HEADcontém 9f7336c873ccffc772168bf49807e23ff74014d3 branch 'master' of URLe .git/refs/remotes/origin/mastercontém 9f7336c873ccffc772168bf49807e23ff74014d3, mas ainda assim recebo a mensagem e git pullnem a git fetchresolvo
Davide
0

Se você receber esta mensagem após fazer uma confirmação para não rastrear o arquivo na ramificação, tente fazer alguma alteração em qualquer arquivo e execute a confirmação. Aparentemente, você não pode fazer um único commit, que inclui apenas o rastreamento de arquivos rastreados anteriormente. Finalmente, este post me ajudou a resolver todo o problema https://help.github.com/articles/removing-files-from-a-repository-s-history/ . Eu apenas tive que remover o arquivo do histórico do repositório.

nurb
fonte