git pull
Buscar de outro repositório ou de uma branch local e integrar
O comando 'git pull' busca o conteúdo de um repositório remoto e o integra imediatamente na sua branch local. É basicamente 'git fetch' seguido de 'git merge' (ou de 'git rebase' com a opção --rebase). É o jeito mais comum de sincronizar o seu repositório local com as mudanças dos outros. Quando você roda git pull, o Git primeiro baixa todos os commits novos do remoto e depois os integra na branch atual. Se a sua branch só está atrás, ele faz fast-forward; se os dois lados têm commits novos, o Git moderno para e pede que você escolha entre merge e rebase (--no-rebase / --rebase, ou a configuração pull.rebase). Se houver mudanças em conflito, o Git para e pede que você resolva os conflitos antes de concluir o merge.
Sinopse
git pull [--rebase | --no-rebase] [--ff-only | --ff | --no-ff] [--commit | --no-commit] [--autostash | --no-autostash] [-q | --quiet] [-v | --verbose] [--depth=<depth>] [--prune] [--tags | --no-tags] [--recurse-submodules[=yes|on-demand|no]] [<repository> [<refspec>...]]Opções
Escolhendo a opção certa
Estratégia de pull: merge ou rebase
A escolha fundamental que afeta o seu histórico de commits
| Comando | Cria commit de merge | Estilo de histórico | Ideal para |
|---|---|---|---|
git pull | Depende da configuração (falha se divergiu e não há configuração) | Definido por pull.rebase / pull.ff | Fast-forward quando só está atrás |
git pull --rebase | No | Linear | Branches de funcionalidade, histórico limpo |
git pull --no-rebase | Sim (se divergiu) | Preserva as branches | Anular a configuração de rebase e forçar merge |
git pull --ff-only | No | Linear (falha se divergiu) | Garantir que não haja merges acidentais |
Opções de segurança e controle
Opções para evitar erros e manter o controle
| Comando | Evita | Comportamento | Quando usar |
|---|---|---|---|
--ff-only | Merges inesperados | Falha se não puder fazer fast-forward | CI/CD, branches protegidas |
--no-commit | Commit automático | Mescla, mas para antes do commit | Revisar o merge antes do commit |
--autostash | Erros de diretório de trabalho com mudanças | Stash → pull → pop | Sincronização rápida com trabalho sem commit |
--dry-run | Quaisquer mudanças | Mostra o que o fetch baixaria; sem merge | Pré-visualizar refs que chegam |
O que é baixado
Controlar quais refs e quanto histórico são baixados
| Comando | Busca tags | Baixa o histórico completo | Caso de uso |
|---|---|---|---|
git pull | Auto (tags seguidas) | Sim | Fluxo normal |
--tags | Todas as tags | Sim | Sincronizar versões lançadas |
--no-tags | No | Sim | Economizar banda, sincronizar só a branch |
--depth=N | Auto (tags seguidas) | Só os N últimos commits | Repositórios grandes, builds de CI |
--unshallow | Auto (tags seguidas) | Converte raso em completo | Precisa do histórico completo depois de um clone raso |
Gerenciamento de remotos e branches
Opções para lidar com vários remotos e refs obsoletas
| Comando | Alcance | Limpa | Cenário |
|---|---|---|---|
git pull origin main | Um só remoto/branch | No | Pull padrão do origin |
--all | Todos os remotos | No | Sincronizar a partir de origin + upstream |
--prune | Um só remoto | Branches excluídas | Remover refs de rastreamento obsoletas |
Cenários avançados
Opções para situações complexas ou incomuns
| Comando | Resolve | Nível de risco | Cenário típico |
|---|---|---|---|
--allow-unrelated-histories | Sem ancestral comum | Médio | Mesclar dois repositórios separados |
-s <strategy> | Necessidades especiais de merge (não evita conflitos) | Baixo | Forçar um algoritmo de merge específico |
--recurse-submodules | Submódulos desatualizados | Baixo | Projetos com submódulos do git |
Exemplos de fluxos de trabalho
git statusVerificar mudanças sem commit que podem conflitar
git stashGuardar com stash o trabalho sem commit se precisar (ou usar --autostash)
git pull --rebase origin mainFazer pull com rebase para manter o histórico limpo
git stash popRestaurar o trabalho guardado, se tiver guardado antes
git checkout feature-branchTrocar para a sua branch de funcionalidade
git pull --no-rebase origin mainMesclar a main mais recente na sua branch de funcionalidade (explicitamente, já que as branches divergiram)
git push origin feature-branchEnviar a branch de funcionalidade atualizada
git fetch originBaixar as mudanças remotas sem mexer no diretório de trabalho
git log HEAD..origin/mainVer quais commits você vai puxar
git diff HEAD...origin/mainRevisar as mudanças feitas no remoto
git pull origin mainFazer o pull quando estiver satisfeito com as mudanças
git pull --no-rebase origin mainTentar um pull com merge - pode gerar conflitos
git statusVer quais arquivos têm conflitos (marcados como 'both modified')
(edit conflicted files)Abrir os arquivos e resolver os marcadores de conflito (<<<<<<<, =======, >>>>>>>)
git add <resolved-files>Preparar os arquivos resolvidos
git commitConcluir o merge com um commit
git pull --rebase --autostash origin mainGuardar as mudanças automaticamente, fazer pull e reaplicá-las
Solução de problemas
Your local changes would be overwritten by merge
Causa: Você tem mudanças sem commit em arquivos que o pull modificaria
Faça commit das mudanças antes (git add . && git commit), guarde-as com stash (git stash) ou use git pull --rebase --autostash
git stash && git pull && git stash popRefusing to merge unrelated histories
Causa: Os repositórios remoto e local não têm ancestral comum (por ex., ao fazer pull em um repositório recém-iniciado)
Permitir o merge de históricos sem relação, algo comum ao adicionar um remoto a um repositório local existente
git pull --allow-unrelated-histories origin mainConflito de merge em arquivo(s)
Causa: Você e o remoto mudaram as mesmas linhas de um arquivo
Abra os arquivos em conflito, procure os marcadores (<<<<<<<, =======, >>>>>>>), edite para resolver, depois git add e git commit. Ou cancele com git merge --abort
git add <resolved-file> && git commitNot possible to fast-forward, aborting
Causa: Você usou --ff-only (ou pull.ff=only está configurado), mas a sua branch local divergiu do remoto
Use rebase em vez disso (git pull --rebase) ou permita um commit de merge (git pull --no-rebase)
git pull --rebase origin mainCannot pull with rebase: You have unstaged changes
Causa: Um pull com rebase precisa de uma árvore de trabalho limpa, e você tem modificações sem commit
Faça commit ou stash das mudanças, ou use autostash para cuidar delas automaticamente
git pull --rebase --autostashNo tracking information for the current branch
Causa: A sua branch não está configurada para rastrear uma branch remota
Defina a branch upstream explicitamente, ou indique o remoto e a branch no comando pull
git branch --set-upstream-to=origin/main main'origin' does not appear to be a git repository
Causa: Nenhum remoto chamado 'origin' está configurado
Confira os remotos com git remote -v e adicione o origin ou use o nome de remoto certo
git remote add origin <url>You have divergent branches and need to specify how to reconcile them
Causa: Os dois lados têm commits novos e nem pull.rebase nem pull.ff estão configurados, então o Git moderno se recusa a adivinhar (versões 2.27+ mais antigas só avisavam)
Indique merge (--no-rebase) ou rebase (--rebase), ou configure um padrão com git config pull.rebase
git config --global pull.rebase trueDicas e armadilhas
Boas práticas
- ✓Sempre confira o git status antes do pull para evitar conflitos com mudanças sem commit
- ✓Use git pull --rebase para manter um histórico limpo e linear em branches de funcionalidade
- ✓Configure pull.rebase=true globalmente se preferir rebase por padrão: git config --global pull.rebase true
- ✓Use git fetch primeiro quando quiser revisar as mudanças antes de integrá-las
- ✓Use --ff-only quando quiser garantir que nenhum commit de merge seja criado sem querer
- ✓Configure o rastreamento com git push -u no primeiro push para simplificar os próximos pulls
- ✓Use --autostash quando tiver mudanças sem commit, mas precisar fazer pull rápido
- ✓Faça pull da main/master com frequência para evitar merges grandes e complexos depois
- ✓Resolva os conflitos na hora - nunca deixe o repositório em estado de conflito
- ✓Use git pull --prune para limpar branches de rastreamento remoto obsoletas
- ✓Considere usar git fetch + git merge para ter mais controle sobre a integração
- ✓Sempre confira se está na branch certa antes do pull para não misturar mudanças
Erros comuns
- ✗Fazer pull com mudanças sem commit: isso pode causar conflitos ou falhar de vez. Sempre faça commit ou stash antes, ou use --autostash para cuidar disso automaticamente.
- ✗Não entender pull e fetch: 'git pull' mescla automaticamente, o que pode surpreender. Use 'git fetch' antes se quiser revisar as mudanças antes de integrá-las.
- ✗Usar merge quando o rebase seria mais limpo: em branches de funcionalidade, 'git pull --rebase' cria um histórico linear mais limpo, sem commits de merge desnecessários.
- ✗Ignorar conflitos de merge: depois de um pull com conflitos, você precisa resolvê-los e fazer commit. Nunca deixe o repositório em estado de conflito.
- ✗Fazer pull na branch errada: sempre confira a branch atual com 'git status' antes do pull. Puxar para a main quando queria puxar para uma branch de funcionalidade pode causar problemas.
Perguntas frequentes
O git fetch só baixa os commits novos do remoto, sem modificar o seu diretório de trabalho nem as suas branches locais. O git pull faz o fetch E mescla (ou faz rebase) automaticamente essas mudanças na sua branch atual. Use fetch quando quiser revisar as mudanças antes de integrá-las.
Use --rebase quando quiser um histórico limpo e linear (principalmente em branches de funcionalidade). Isso reaplica os seus commits locais em cima dos commits baixados em vez de criar um commit de merge. Use o pull comum (merge) quando quiser preservar exatamente o histórico de quando as mudanças foram feitas.
O fast-forward acontece quando a sua branch local não tem commits novos que o remoto não tenha. O Git só avança o ponteiro da branch até o remoto - nenhum commit de merge é necessário. Se você tem commits locais, o Git precisa criar um commit de merge ou fazer rebase - e, a menos que você passe --rebase/--no-rebase ou configure pull.rebase, o Git moderno para com “Need to specify how to reconcile divergent branches”.
Use git pull --rebase para reaplicar os seus commits locais em cima dos commits remotos, criando um histórico linear. Ou use git pull --ff-only, que só funciona se um fast-forward for possível (falha se você tiver commits locais à frente).
Depende. Com um pull por merge, o Git permite se os commits que chegam não mexem nos arquivos que você modificou; senão ele recusa com “Your local changes ... would be overwritten by merge”. Com --rebase, qualquer mudança sem commit bloqueia o pull. Boa prática: faça commit antes, ou use git pull --rebase --autostash para guardar e restaurar as suas mudanças automaticamente.
O Git pausa o merge e marca os arquivos em conflito. Abra cada um, procure os marcadores de conflito (<<<<<<<, =======, >>>>>>>), edite para resolver, depois git add no arquivo e git commit para concluir o merge. Use git merge --abort para cancelar (ou, no git pull --rebase, git rebase --continue / git rebase --abort).
Logo depois do pull, rode git reset --hard ORIG_HEAD - o Git guarda a ponta anterior em ORIG_HEAD em merges, fast-forwards e rebases. Não use HEAD~1: um fast-forward pode ter trazido vários commits. O --hard também descarta mudanças sem commit. Se o ORIG_HEAD já mudou, encontre a ponta antiga com git reflog.
Normalmente significa que você está puxando da branch ou do remoto errado. Confira: git branch -vv para ver as informações de rastreamento, git remote -v para verificar os remotos, e git fetch --all seguido de git log origin/main para ver os commits remotos.
git pull origin main indica explicitamente o remoto e a branch de onde puxar. git pull (sem argumentos) usa a branch de rastreamento configurada para a sua branch atual. Se o rastreamento não estiver configurado, aparece um erro pedindo que você os indique.
Globalmente: git config --global pull.rebase true (para rebase) ou git config --global pull.rebase false (para merge). Também dá para definir por repositório sem --global, ou por branch com git config branch.<name>.rebase true.