Eu configurei alguns branches de rastreamento remoto no git, mas nunca consigo mesclá-los no branch local depois de atualizá-los com 'git fetch'.
Por exemplo, suponha que eu tenha um ramo remoto chamado 'outro-ramo'. Eu configurei isso localmente como um ramo de rastreamento usando
git branch --track an-other-branch origin/an-other-branch
Por enquanto, tudo bem. Mas se esse branch for atualizado (geralmente por mim movendo a máquina e fazendo commit dessa máquina), e eu quero atualizá-lo na máquina original, estou tendo problemas com buscar / mesclar:
git fetch origin an-other-branch
git merge origin/an-other-branch
Sempre que faço isso, recebo uma mensagem 'Já atualizado' e nada se mescla.
No entanto, um
git pull origin an-other-branch
sempre o atualiza como você esperava.
Além disso, executando git diff
git diff origin/an-other-branch
mostra que existem diferenças, então acho que minha sintaxe está errada.
O que estou fazendo de errado?
EDIT [2010-04-09]: Eu verifiquei algumas vezes e, definitivamente, não estou em um ramo diferente. Meu 'git fetch' seguido por um 'git merge' (como mostrado acima) deve fazer exatamente a mesma coisa que um git pull? Vou obter algum fluxo de trabalho mostrando os resultados de um status git etc.
git fetch origin an-other-branch
armazena a dica buscadaFETCH_HEAD
, mas nãoorigin/an-other-branch
(ou seja, o 'ramo de rastreamento remoto' usual). Então, pode-se fazergit fetch origin an-other-branch && git merge FETCH_HEAD
, mas fazer como @Gareth diz é melhor (ou apenas use git pull ).git merge origin/an-other-branch
mesclarorigin/an-other-branch
em todas as ramificações locais definidas para rastreá-lo? como posso mesclar em apenas uma filial local?git pull
(sem argumentos) faz - qual branch ele mescla? Ele mescla o branch de rastreamento remoto correspondente ao branch atual ?Selecionando apenas um ramo:
fetch
/merge
vs.pull
As pessoas freqüentemente aconselham você a separar "buscar" de "mesclar". Eles dizem em vez disso:
faça isso:
O que eles não mencionam é que esse comando fetch irá, na verdade, buscar todos os branches do repositório remoto, o que não é o que esse comando pull faz. Se você tem milhares de branches no repositório remoto, mas não deseja ver todos eles, pode executar este comando obscuro:
Claro, isso é ridiculamente difícil de lembrar, então se você realmente deseja evitar buscar todos os branches, é melhor alterá-lo
.git/config
conforme descrito no ProGit.Hã?
A melhor explicação de tudo isso está no Capítulo 9-5 do ProGit, Git Internals - The Refspec ( ou via github ). Isso é incrivelmente difícil de encontrar pelo Google.
Primeiro, precisamos esclarecer algumas terminologias. Para o rastreamento de filial remota, normalmente existem 3 ramos diferentes a serem considerados:
refs/heads/branchB
dentro do outro reporefs/remotes/remoteR/branchB
em seu reporefs/heads/branchB
dentro de seu repoRamificações de rastreamento remoto (in
refs/remotes
) são somente leitura. Você não os modifica diretamente. Você modifica seu próprio branch e, em seguida, envia para o branch correspondente no repo remoto. O resultado não é refletido em seurefs/remotes
até depois de um puxão ou busca apropriado. Essa distinção foi difícil para mim entender nas páginas de manual do git, principalmente porque o branch local (refs/heads/branchB
) é dito para "rastrear" o branch de rastreamento remoto quando é.git/config
definidobranch.branchB.remote = remoteR
.Pense em 'refs' como ponteiros C ++. Fisicamente, eles são arquivos contendo resumos SHA, mas basicamente são apenas ponteiros para a árvore de commits.
git fetch
irá adicionar muitos nós à sua árvore de commit, mas como o git decide quais ponteiros mover é um pouco complicado.Conforme mencionado em outra resposta , nenhum
nem
iria se mover
refs/remotes/branches/branchB
, e o último certamente não pode se moverrefs/heads/branchB
. No entanto, ambos se movemFETCH_HEAD
. (Você podecat
usar qualquer um desses arquivos.git/
para ver quando eles mudam.) Egit merge
irá se referir aFETCH_HEAD
, durante a configuraçãoMERGE_ORIG
, etc.fonte
Tem certeza de que está no local
an-other-branch
ao mesclar?A outra explicação :
Mas, no seu caso, se
git pull
funcionar, isso significa apenas que você não está no ramo certo.fonte
Git pull é, na verdade, uma ferramenta de combinação: executa git fetch (obtendo as alterações) e git merge (mesclando-os com sua cópia atual)
Tem certeza de que está no branch correto?
fonte
estes são os comandos:
se você fizer isso na segunda linha:
ele tentará mesclar o master local em seu branch atual.
A questão, como eu entendi, era que você já buscou localmente e deseja agora mesclar seu branch com o mais recente do mesmo branch.
fonte