Acabei de observar algo estranho git pull
, que não entendo.
Na sexta-feira, trabalhei em uma filial local. vamos chamá-lo mybranch
. Antes de deixar o escritório Empurrei-a origem (que é o meu github repo): git push origin mybranch
.
Ontem em casa, pull
mudei meubranch para meu laptop, fiz mais alguma codificação e, em seguida, empurrei minhas alterações de volta para o github (origem).
Agora estou no trabalho novamente e tentei puxar as alterações de ontem para minha máquina de trabalho (não mudei nada no repositório local do meu local de trabalho no fim de semana):
git pull origin mybranch
que causou uma fusão de avanço rápido, o que é bom. Então eu fiz um git status
, e ele disse:
# On branch mybranch
# Your branch is ahead of 'origin/mybranch' by 6 commits.
#
nothing to commit (working directory clean)
Hã? Como pode ser 6 commits à frente quando eu nem toquei no fim de semana, E apenas puxei da origem? Então eu rodei um git diff origin/mybranch
e os diffs eram exatamente as 6 alterações que acabei de extrair do controle remoto.
Eu só poderia "consertar" isso executando git fetch origin
:
From [email protected]:me/project
af8be00..88b0738 mybranch -> origin/mybranch
Aparentemente, meu repositório local estava faltando alguns objetos de referência, mas como pode ser isso? Quer dizer, um pull já faz uma busca, e eu não trabalhei em nada exceto naquele branch, então a git fetch origin
e git fetch origin mybranch
deveria ter o mesmo resultado?
Devo sempre usar em git pull origin
vez de git pull origin branchname
?
Estou confuso.
fonte
git push
também parecerá resolvê-lo (relatando "tudo atualizado").git config --get-regexp br.*
pode dizer se sua configuração tem um branch local está rastreando outro branchgit config branch.master.remote yourGitHubRepo.git
seu workRepo e verificar (a seguirgit pull origin
) se o status permanece com um aviso 'em frente'?git remote show origin
me mostra que a origem aponta para meu repositório GitHub, então deve estar tudo bem, eu acho?Your branch is ahead
mensagem de aviso " " após umgit pull
, você precisa primeiro definir também o nome remoto de uma ramificação . Daí minha sugestão: digitegit config branch.master.remote yourGitHubRepo.git
, tente agit pull
e agit status
e veja se o problema persiste.Respostas:
git pull
chamadasgit fetch
com os parâmetros apropriados antes de mesclar os cabeçotes buscados explicitamente (ou, se nenhum, o branch remoto configurado para mesclar) no branch atual.A sintaxe:
git fetch <repository> <ref>
onde<ref>
é apenas um nome de ramificação sem dois-pontos é uma busca 'única' que não faz uma busca padrão de todas as ramificações rastreadas do controle remoto especificado, mas, em vez disso, busca apenas a ramificação nomeadaFETCH_HEAD
.Atualização: para versões do Git desde 1.8.4, se houver um branch de rastreamento remoto que rastreia o ref que você pediu para buscar, o branch de rastreamento agora será atualizado por
fetch
. Essa alteração foi feita especificamente para evitar a confusão que o comportamento anterior causou.Quando você executa
git pull <repository> <ref>
,FETCH_HEAD
é atualizado como acima, em seguida, mesclado em seu check-out,HEAD
mas nenhum dos branches de rastreamento padrão para o repositório remoto será atualizado (Git <1.8.4). Isso significa que localmente parece que você está à frente do branch remoto, mas na verdade você está atualizado com ele.Pessoalmente, sempre faço
git fetch
seguido porgit merge <remote>/<branch>
porque vejo quaisquer avisos sobre atualizações forçadas antes de mesclar e posso visualizar o que estou mesclando. Se eu usassegit pull
um pouco mais do que faço, faria um simplesgit pull
sem parâmetros a maioria do tempo, contando combranch.<branch>.remote
ebranch.<branch>.merge
para 'fazer a coisa certa'.fonte
git fetch
after agit pull <repository> <ref>
corrigiria o problema, uma vez que a busca atualizaria os branches de rastreamento padrão? Além disso, obrigado por esta resposta, começando a fazer sentido :)git fetch
seguido porgit merge origin/master master
.O que
git remote -v show
retorna quando se trata de origem?Se a origem apontar para o github, o status deve ser atualizado e não antes de qualquer repo remoto. Pelo menos, com o Git1.6.5 estou usando para um teste rápido.
De qualquer forma, para evitar isso, defina explicitamente o repo remoto do branch master:
em seguida
git pull origin master
, a , seguido por a,git status
deve retornar um status limpo (sem à frente).Por quê? porque o get fetch origin master (incluído no git pull origin master) não apenas atualizaria
FETCH_HEAD
(como Charles Bailey explica em sua resposta ), mas também atualizaria o "branch master remoto" dentro do seu repositório Git local.Nesse caso, seu mestre local não pareceria mais estar "à frente" do mestre remoto.
Posso testar isso, com um git1.6.5:
Primeiro eu crio um workrepo:
Eu simulo um repositório GitHub criando um repositório simples (que pode receber push de qualquer lugar)
Eu adiciono um modif ao meu repo de trabalho, que empurro para o repo do github (adicionado como um remoto)
Eu crio um repositório doméstico, clonado do GitHub, no qual faço algumas modificações, enviadas ao GitHub:
Eu então clono o workrepo para um primeiro experimento
Nesse repo, git status menciona master geing antes de '
origin
':Mas isso só
origin
não é github:Mas se eu repetir a sequência em um repo que tem uma origem no github (ou nenhuma origem, apenas um 'github' remoto definido), o status é limpo:
Se eu tivesse apenas
origin
apontandogithub
,status
estaria limpo para git1.6.5.Pode ser com um aviso 'à frente' para o git anterior, mas de qualquer maneira, um
git config branch.master.remote yourGitHubRepo.git
definido explicitamente deve ser capaz de cuidar disso, mesmo com as primeiras versões do Git.fonte
git remote show origin
.Você tem o cuidado de adicionar todo o seu controle remoto (exceto o
origin
que vem com o seu clone original) usandogit remote add NAME URL
? Eu vi esse bug quando eles acabaram de ser adicionados à configuração do git.fonte
git checkout -b mybranch origin/mybranch
. De acordo com a página de manual do git-branch, a origem / mybranch é o ponto de início e, além disso, afirma para --track: "... Use isto se você sempre puxar do mesmo branch upstream para o novo branch, e se você não quiser usar "git pull <repository> <refspec>" explicitamente. Este comportamento é o padrão quando o ponto de início é um branch remoto. "