Selecionando apenas um ramo: fetch
/ merge
vs. pull
As pessoas freqüentemente aconselham você a separar "buscar" de "mesclar". Eles dizem em vez disso:
git pull remoteR branchB
faça isso:
git fetch remoteR
git merge remoteR branchB
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:
git fetch remoteR refs/heads/branchB:refs/remotes/remoteR/branchB
git branch -a # to verify
git branch -t branchB remoteR/branchB
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:
- O branch no repo remoto:
refs/heads/branchB
dentro do outro repo
- Seu branch de rastreamento remoto :
refs/remotes/remoteR/branchB
em seu repo
- Seu próprio branch:
refs/heads/branchB
dentro de seu repo
Ramificaçõ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 seu refs/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
definido branch.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
git pull remoteR branchB
nem
git fetch remoteR branchB
iria se mover refs/remotes/branches/branchB
, e o último certamente não pode se mover refs/heads/branchB
. No entanto, ambos se movem FETCH_HEAD
. (Você pode cat
usar qualquer um desses arquivos .git/
para ver quando eles mudam.) E git merge
irá se referir a FETCH_HEAD
, durante a configuração MERGE_ORIG
, 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 ).