git fetch
Baixar objetos e refs de outro repositório
O comando 'git fetch' baixa commits, arquivos e refs de um repositório remoto para o seu repositório local. Ele permite ver no que os outros trabalharam sem mesclar essas mudanças nas suas branches locais. Ao contrário do 'git pull', o fetch é seguro - nunca muda o seu diretório de trabalho nem a branch atual. Depois do fetch, você pode revisar as mudanças e decidir se quer mesclá-las.
Sinopse
git fetch [<options>] [<repository> [<refspec>...]]
git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)...]
git fetch --all [<options>]Opções
Escolhendo a opção certa
Fetch ou pull
Entender a diferença principal entre fetch e pull
| Comando | Baixa commits | Atualiza a branch local | Seguro a qualquer hora |
|---|---|---|---|
git fetch | Sim | Não - só o rastreamento remoto | Sim - nunca muda o diretório de trabalho |
git pull | Sim | Sim - mescla na atual | Cuidado - pode causar conflitos |
git pull --rebase | Sim | Sim - faz rebase da atual | Cuidado - reescreve commits locais |
Opções de fetch para limpeza
Opções para manter o repositório arrumado
| Comando | Remove branches obsoletas | Busca tags | Caso de uso |
|---|---|---|---|
git fetch | No | Algumas (alcançáveis) | Atualização padrão |
git fetch --prune | Sim | Algumas (alcançáveis) | Limpar branches excluídas |
git fetch --tags | No | Todas as tags | Pegar as tags de release |
git fetch --prune --tags | Sim | Todas as tags | Limpar branches + pegar todas as tags (tags só locais são mantidas) |
Alcance do fetch
Controlar o que é baixado
| Comando | Busca de | Ideal para |
|---|---|---|
git fetch | Remoto padrão (origin) | Uso mais comum |
git fetch origin | Remoto específico | Quando você tem vários remotos |
git fetch --all | Todos os remotos | Sincronizar um fork com o upstream |
git fetch origin main | Só uma branch | Download mínimo |
Exemplos
Fetch do remoto padrão
git fetchBaixa os commits novos do remoto padrão (normalmente 'origin') sem mesclar.
Fetch de um remoto específico
git fetch originFazer fetch explicitamente do remoto 'origin'.
Fetch de todos os remotos
git fetch --allFazer fetch de todos os remotos configurados de uma vez.
Fetch e poda de branches obsoletas
git fetch --pruneFazer fetch e remover as branches de rastreamento remoto que não existem mais no remoto.
Exemplos de fluxos de trabalho
git fetch originBaixar as mudanças remotas sem mesclar
git log main..origin/mainVer commits do remoto que não estão na sua branch local
git diff main...origin/mainRevisar as mudanças de código feitas no remoto
git merge origin/mainMesclar quando estiver pronto
git remote add upstream <original-repo-url>Adicionar o repositório original como upstream (uma vez)
git fetch upstreamPegar o mais recente do repositório original
git checkout mainTrocar para a sua branch main
git merge upstream/mainMesclar as mudanças do upstream no seu fork
git push origin mainEnviar o fork atualizado para o seu GitHub
git fetch --pruneFazer fetch e remover branches de rastreamento remoto obsoletas
git branch -vvVer as branches locais e o status de rastreamento delas
git branch -d old-featureExcluir branches locais que rastreavam remotas excluídas
Solução de problemas
fatal: 'origin' does not appear to be a git repository
Causa: Nenhum remoto chamado 'origin' está configurado
Confira os remotos com 'git remote -v'. Adicione um com 'git remote add origin <url>'
Fiz fetch, mas a minha branch local não atualizou
Causa: O fetch só atualiza as branches de rastreamento remoto, não as branches locais
Isso é esperado! Rode 'git merge origin/main' ou 'git pull' para atualizar a branch local
error: cannot lock ref - unable to update local ref
Causa: Uma ref de rastreamento remoto obsoleta conflita com um nome de branch novo (por ex. 'feature' e 'feature/login')
Rode 'git remote prune origin' ou 'git fetch --prune' para remover as refs obsoletas e faça fetch de novo
Branches remotas excluídas continuam aparecendo
Causa: É preciso podar as branches de rastreamento remoto obsoletas
Use 'git fetch --prune' ou 'git remote prune origin'
O fetch está muito lento ou baixa demais
Causa: Você está baixando o histórico inteiro quando só precisa dos commits recentes
Use 'git fetch --depth=1' para um fetch raso, ou busque só uma branch específica
Dicas e armadilhas
Boas práticas
- ✓Faça fetch antes de começar a trabalhar para ver se há mudanças remotas que você precisa conhecer
- ✓Use --prune com frequência para manter o repositório livre de branches obsoletas
- ✓Prefira fetch + merge a pull quando quiser revisar as mudanças antes de integrá-las
- ✓Configure 'git config fetch.prune true' para sempre podar no fetch
- ✓Use 'git fetch --all' ao trabalhar com forks para sincronizar origin e upstream de uma vez
Erros comuns
- ✗Esperar que o fetch atualize o seu diretório de trabalho - ele só atualiza as branches de rastreamento remoto, não as suas branches locais.
- ✗Esquecer de fazer merge ou rebase depois do fetch - o fetch baixa, mas não integra as mudanças.
- ✗Não usar --prune com frequência, deixando branches de rastreamento remoto obsoletas bagunçando o repositório.
- ✗Confundir fetch com pull - pull = fetch + merge, enquanto o fetch é só a etapa de download.
Perguntas frequentes
O fetch baixa commits, mas não muda as suas branches locais. Pull = fetch + merge (ou rebase). O fetch é mais seguro porque deixa você revisar as mudanças antes de integrá-las.
O fetch só atualiza as branches de rastreamento remoto (como origin/main), não as suas branches locais. Você precisa de merge ou rebase para atualizar a branch local.
Use 'git log main..origin/main' para ver commits do remoto que não estão na sua branch local, ou 'git diff main...origin/main' para ver as mudanças de código feitas no remoto.
Fetch quando quiser revisar as mudanças antes ou quando trabalhar em branches importantes. Pull para atualizações rápidas quando você confia nas mudanças que chegam.
Use 'git fetch origin branch-name' para buscar só essa branch. Útil em repositórios grandes em que você não precisa de tudo.
Ele remove as branches de rastreamento remoto que não existem mais no remoto. Mantém o repositório limpo quando colegas excluem branches mescladas.