Trilha de aprendizado · Nível 3 · Tutorial 4

Sincronizar alterações com fetch, pull e push

Buscar mudanças do GitHub, integrá-las à branch local e publicar novos commits em um fluxo de merge, inclusive quando o remoto recebe alterações antes do envio.

  • Nível: Intermediário
  • Duração: 24 min
  • 8 passos
Sincronizar alterações com fetch, pull e push

O que você vai percorrer

  1. Escolher entre fetch, pull e push Escolha a operação adequada para buscar novidades, integrá-las à branch local ou publicar seus commits. 2 min
  2. Buscar atualizações sem mudar os arquivos Execute git fetch origin e entenda o que muda nas referências locais, sem alterar sua branch nem seus arquivos de trabalho. 3 min
  3. Comparar a branch local com origin Use o grafo e os contadores de acompanhamento para diagnosticar a relação entre os históricos após o fetch. 3 min
  4. Integrar as mudanças depois do fetch Integrar a referência remota na branch local correta e prever quando haverá avanço direto ou um commit de merge. 3 min
  5. Usar pull com a estratégia de merge Use pull com merge explícito e escolha quando separar a busca da integração para inspecionar as novidades. 3 min
  6. Recuperar um push rejeitado Planeje uma nova busca, a integração por merge e o reenvio após uma rejeição por histórico remoto atualizado. 4 min
  7. Lidar com conflitos durante a sincronização Resolva um conflito entre mudanças locais e remotas, preserve as duas intenções e reconheça quando o push pode ser retomado. 4 min
  8. Aplicação final: sincronizar e conferir Resolva uma rejeição de envio e comprove a sincronização pelo estado, pelo histórico atualizado e pelo conteúdo dos arquivos. 4 min

O que você vai aprender

  • Distinguir fetch, pull e push pelo sentido da transferência e pelo efeito sobre a branch local.
  • Buscar atualizações com fetch e identificar a relação entre a branch local e a referência origin correspondente.
  • Integrar atualizações com merge após fetch ou usar pull com a estratégia de merge explícita.
  • Responder a uma rejeição de push por histórico remoto adiantado buscando e integrando as mudanças antes de tentar novamente.
  • Conferir a sincronização no estado, no histórico e nos arquivos, sem usar envio forçado.

Antes de começar

  • Publicar um repositório local no GitHub
  • Clonar um repositório do GitHub
  • Inspecionar alterações e histórico com diff e log
  • Integrar branches locais com merge
  • Resolver conflitos simples de merge

Passo 1 de 8

Escolher entre fetch, pull e push

Escolha a operação adequada para buscar novidades, integrá-las à branch local ou publicar seus commits.

Três operações, três objetivos

Fetch: buscar sem integrar

Traz informações e commits do remoto para o repositório local, mas não integra essas mudanças à branch atual. Seus arquivos de trabalho permanecem como estavam.

Pull: buscar e integrar

Busca atualizações do remoto e as integra à branch atual. Portanto, pode atualizar seus arquivos de trabalho. Neste tutorial, usaremos pull com a estratégia de merge.

Push: publicar

Envia commits locais para atualizar uma branch no remoto. O sentido é o contrário: do seu repositório para o GitHub, não do GitHub para sua branch local.

Buscar sem incorporar

Qual operação atende à necessidade?

Uma colega publicou mudanças no GitHub. Você quer obter os novos commits, mas deixar a integração para depois, mantendo sua branch atual e seus arquivos como estão. Qual operação escolher?

Integrar não é publicar

Exemplo

Cada operação tem seu papel

Você usa pull para trazer e integrar uma correção publicada pela equipe. Depois, faz uma melhoria e cria um commit local.

Para compartilhar esse novo commit no GitHub, a operação é push. Fazer outro pull não publica seu trabalho: ele atua na busca e na integração de mudanças do remoto.

Dica

Não é uma sequência obrigatória

Fetch, pull e push têm papéis complementares, mas não precisam ser executados sempre em sequência. Pull já inclui uma busca; fetch permite buscar sem integrar naquele momento.

Associe a necessidade à operação

Qual é o objetivo agora?

Associe cada necessidade à operação correspondente.

Toque em um item e depois no par correspondente.

Passo 2 de 8

Buscar atualizações sem mudar os arquivos

Execute git fetch origin e entenda o que muda nas referências locais, sem alterar sua branch nem seus arquivos de trabalho.

Atualize o que seu Git conhece

Uma referência local, não uma consulta ao vivo

A referência de acompanhamento remoto origin/<nome-da-branch>, como origin/main, fica no seu repositório local. Ela representa o último estado conhecido daquela branch no remoto, não uma consulta em tempo real ao GitHub.

No terminal, dentro da pasta do projeto com origin configurado, execute:

bash
git fetch origin

O que essa busca altera

O comando busca novos commits em origin e atualiza as referências de acompanhamento remoto configuradas — não apenas a correspondente à branch atual.

Sua branch atual não se move, e os arquivos de trabalho permanecem iguais, inclusive suas edições ainda não commitadas.

A referência acompanha em tempo real?

Avalie a afirmação

Você executou git fetch origin. Depois, outra pessoa publicou um novo commit na main do GitHub. Sem nenhuma outra comunicação com o remoto, sua referência origin/main já aponta para esse novo commit.

Commit disponível não significa arquivo alterado

Exemplo

Antes e depois da busca

Neste exemplo, a branch se chama main. Os commits são representados por A e B: B vem depois de A e altera o arquivo README.md.

Antes da busca:

  • No GitHub, main aponta para B.
  • No seu repositório, main e origin/main ainda apontam para A.

Depois de git fetch origin:

  • O commit B passa a estar disponível no repositório local.
  • origin/main passa a apontar para B.
  • Sua branch main continua apontando para A.
  • O README.md da pasta de trabalho continua como estava.

As duas referências locais agora apontam para commits diferentes, sem que a busca tenha aplicado mudanças aos arquivos.

Preveja o resultado do fetch

Novidades no remoto, edição no computador

Você está na branch documentacao e tem uma edição ainda não commitada no README.md. O remoto recebeu novos commits nessa branch. Ao executar git fetch origin com sucesso, o que acontece?

Passo 3 de 8

Comparar a branch local com origin

Use o grafo e os contadores de acompanhamento para diagnosticar a relação entre os históricos após o fetch.

Compare as duas referências

Onde cada histórico termina?

Após o git fetch origin, visualize o histórico com o comando abaixo. Nos exemplos, a branch é main: localize as etiquetas HEAD -> main e origin/main. No seu projeto, compare as referências com o nome real da branch.

Visualizar as referências no grafo

bash
git log --oneline --graph --all --decorate

Quatro relações possíveis

Um commit é exclusivo de um lado quando faz parte daquele histórico, mas não do outro.

  • Alinhados: as duas referências apontam para o mesmo commit.
  • Local adiantada: só a branch local tem commits exclusivos.
  • Local atrasada: só origin/main tem commits exclusivos.
  • Divergentes: cada lado tem commits exclusivos.

Siga as conexões do grafo; não se baseie apenas na posição das linhas.

Classifique os grafos

Qual é a relação entre os históricos?

Cada grafo representa uma situação independente após o fetch. Associe cada um ao diagnóstico de main em relação a origin/main.

Toque em um item e depois no par correspondente.

Leia os contadores de acompanhamento

Avanço e atraso em números

Quando main tem origin/main como upstream, git branch -vv e git status podem mostrar a diferença entre os históricos. Esses contadores usam referências locais: interprete-os após o fetch, sem tratá-los como uma consulta em tempo real ao GitHub.

Exemplo de sessão no terminal

text
$ git branch -vv
* main 8a1b2c3 [origin/main: ahead 1, behind 2] Ajusta menu

$ git status --short --branch
## main...origin/main [ahead 1, behind 2]

O que os números contam

  • ahead 1: há 1 commit exclusivo de main.
  • behind 2: há 2 commits exclusivos de origin/main.

Como os dois lados têm commits exclusivos, os históricos estão divergentes. Os números contam commits, não arquivos.

Dica

Limpo não significa sincronizado

Na saída curta de status, nenhuma linha de arquivo aparece abaixo do cabeçalho: não há alterações pendentes para commit. Mesmo assim, os históricos divergem. Limpeza da árvore de trabalho e alinhamento dos históricos são verificações diferentes.

Diagnostique sem confundir arquivos e commits

Uma nova situação

Após um novo fetch, main acompanha origin/main. Você executa git status --short --branch e obtém somente esta linha:

Saída completa

text
## main...origin/main [ahead 2, behind 1]

Qual diagnóstico essa saída permite?

Considere tanto os arquivos de trabalho quanto os históricos.

Passo 4 de 8

Integrar as mudanças depois do fetch

Integrar a referência remota na branch local correta e prever quando haverá avanço direto ou um commit de merge.

Prepare a branch que receberá as mudanças

O destino é a branch local atual

Neste exemplo, vamos atualizar a branch local site, que já existe. No seu projeto, use o nome real da branch.

Execute os comandos abaixo um de cada vez. Confira o estado antes da troca e antes da integração. Se houver alterações pendentes, registre o trabalho na branch adequada antes de continuar.

Confira, selecione e confira novamente

bash
git status
git switch site
git status

Integre a referência correspondente

Depois de executar git fetch origin e inspecionar o histórico, integre com o comando abaixo. origin/site é a referência a integrar; quem recebe as mudanças é site, a branch atual. Não troque para origin/site.

Com site selecionada e o trabalho limpo

bash
git merge origin/site

Organize a integração

Sem integrar na branch errada

Você já fez fetch e inspecionou as novidades de origin/site, mas ainda está em main. Ordene os passos para integrá-las em site. Neste cenário, as duas conferências de estado indicarão trabalho limpo.

  1. git switch site — selecionar a branch local de destino.
  2. git status — conferir o estado antes de sair de main.
  3. git status — confirmar a branch site e o trabalho limpo.
  4. git merge origin/site — integrar as mudanças buscadas.

O mesmo comando, dois resultados

A relação entre os históricos determina o resultado. Nos exemplos abaixo, o avanço direto está habilitado e as mudanças são compatíveis.

Exemplo

Branch local apenas atrasada

No caminho A → B → C → D, site está em B e origin/site está em D.

git merge origin/site avança site até D e atualiza os arquivos. Não é necessário criar um commit de merge.

Exemplo

Históricos divergentes

Após B, você criou L em site, enquanto outra pessoa criou R no remoto, agora representado por origin/site.

O mesmo comando combina as mudanças compatíveis em um commit de merge M. site passa a apontar para M, preservando L e R no histórico.

Dica

Integrar não é publicar

O merge altera o histórico e os arquivos locais, não o GitHub. Ele também não move origin/site. Se criou um commit de merge, esse commit ainda precisa ser publicado.

Preveja o resultado

Novidades dos dois lados

Após o fetch, você está em site, com trabalho limpo. Desde o último ancestral comum, site ganhou um commit exclusivo em menu.html e origin/site ganhou outro em rodape.html. As mudanças são compatíveis.

Qual será o resultado de git merge origin/site?

Passo 5 de 8

Usar pull com a estratégia de merge

Use pull com merge explícito e escolha quando separar a busca da integração para inspecionar as novidades.

Buscar e integrar em uma execução

Com a branch de destino selecionada e a árvore de trabalho limpa, você pode encadear a busca e a integração. Neste exemplo, main acompanha origin/main.

O comando abaixo busca atualizações usando o upstream configurado e as integra por merge na branch atual. A opção --no-rebase explicita a estratégia de merge para esta execução.

bash
git pull --no-rebase

Dica

Integração não é publicação

Pull não envia commits locais ao GitHub. Se houver commits locais a publicar, isso continua sendo tarefa do push.

Explicite a estratégia

Complete o comando

Você quer buscar atualizações do upstream e integrá-las na branch atual. Preencha com a opção que explicita a estratégia de merge para esta execução:

git pull ____

Você precisa de uma pausa?

Escolha pelo momento da inspeção

Quer examinar as novidades antes de integrar? Use git fetch origin, inspecione o histórico e só então decida executar git merge origin/main, estando em main.

Quer buscar e integrar em sequência? Use git pull --no-rebase, com o upstream correto configurado. Ele não oferece uma pausa entre a busca e a integração para você examinar as novidades.

Aqui, main é o nome da branch do exemplo; no projeto, considere o nome real.

Dica

Merge não exige um novo commit

Se a branch local estiver apenas atrasada, o avanço direto continua possível com git pull --no-rebase. Essa opção escolhe a estratégia de integração, mas não obriga a criar um commit de merge.

Escolha o fluxo e preveja o resultado

Inspecionar antes de integrar

Você está em main, que acompanha origin/main, com a árvore de trabalho limpa. Neste cenário, o remoto contém todos os commits locais e mais dois commits novos.

Você quer examinar esses commits antes de integrá-los. Qual plano atende a essa intenção e qual resultado o histórico permite?

Passo 6 de 8

Recuperar um push rejeitado

Planeje uma nova busca, a integração por merge e o reenvio após uma rejeição por histórico remoto atualizado.

O remoto mudou antes do envio

Uma atualização entre a busca e o push

Você está na branch ajustes, com a árvore de trabalho limpa. Depois do último fetch, criou o commit local L. Nesse intervalo, uma colega publicou o commit R na mesma branch do GitHub. Seu envio é rejeitado:

Comando e trecho da saída

text
$ git push origin ajustes
! [rejected] ajustes -> ajustes (fetch first)

A rejeição protege o histórico remoto

Esse é um caso de atualização não fast-forward: sua branch ainda não contém R. Atualizar o remoto diretamente para L deixaria R fora do histórico dessa branch. Seus commits locais continuam intactos.

Repetir o mesmo push não resolve. O caminho é buscar novamente → inspecionar → integrar por merge → conferir → reenviar.

Atenção

Identifique o tipo de erro

Este procedimento trata a rejeição por histórico remoto atualizado, não erros de autenticação ou permissão. Não use envio forçado: a recuperação deve preservar os commits dos dois lados.

Organize a recuperação

Da rejeição à nova tentativa

Você confirmou que está em ajustes, sem alterações pendentes. As mudanças são compatíveis e não haverá conflitos. Ordene as ações para recuperar o push rejeitado, mantendo uma pausa para inspecionar o histórico.

  1. Inspecionar com `git log --oneline --graph --all --decorate`.
  2. Executar `git fetch origin`.
  3. Conferir se o merge foi concluído e se os arquivos ficaram como esperado.
  4. Integrar com `git merge origin/ajustes`.
  5. Tentar novamente com `git push origin ajustes`.

O que muda para o próximo push

Os dois históricos passam a fazer parte do resultado

No cenário anterior, L é seu commit local e R é o commit da colega. O merge sem conflitos cria M, unindo as duas linhas de histórico:

Esquema do histórico

Representação simplificada, não uma saída de comando.

text
Após o fetch:
    L  (ajustes)
   /
  A---R  (origin/ajustes)

Após o merge, antes do push:
    L---M  (ajustes)
   /   /
  A---R    (origin/ajustes)

Exemplo

Agora o envio preserva R

M tem tanto L quanto R em sua ancestralidade. Se o remoto continuar em R, git push origin ajustes poderá avançar a branch remota até M sem descartar nenhum desses commits.

O merge foi local: ele preparou o histórico para o envio, mas não publicou M.

Buscar já é suficiente?

Justifique a próxima ação

Após outra rejeição por histórico remoto atualizado, você executou git fetch origin. Está na branch documentacao, com a árvore de trabalho limpa, e o grafo mostra commits exclusivos em documentacao e em origin/documentacao.

Uma pessoa sugere repetir o push porque o fetch terminou. Sem conflitos e sem novas mudanças remotas, quais passos ainda faltam? Cite os comandos de integração e envio e explique por que o fetch sozinho não basta.

Escreva pelo menos 60 caracteres (0/60).

Passo 7 de 8

Lidar com conflitos durante a sincronização

Resolva um conflito entre mudanças locais e remotas, preserve as duas intenções e reconheça quando o push pode ser retomado.

A integração parou no conflito

Duas mudanças no mesmo trecho

Na branch main deste exemplo, um push foi rejeitado. Você buscou as novidades, inspecionou o histórico e executou git merge origin/main. A integração parou neste trecho de README.md:

Trecho em conflito

text
<<<<<<< HEAD
Encontro: sábado, às 10h.
=======
Encontro: sábado, com transmissão online.
>>>>>>> origin/main

Dica

Quais versões estão envolvidas?

Aqui, HEAD identifica a versão da branch local atual. origin/main identifica a versão do histórico remoto buscado.

Um conflito também pode interromper git pull --no-rebase, pois ele faz a integração por merge após a busca.

Preservar a intenção das mudanças

Qual deve ser o resultado?

No conflito anterior, a versão local acrescentou o horário das 10h, e a versão remota acrescentou a transmissão online. A equipe confirmou que as duas informações devem permanecer.

Identifique os históricos representados por HEAD e origin/main e escreva uma linha final que preserve as duas mudanças.

Escreva pelo menos 40 caracteres (0/40).

Quando retomar o envio

Resolvido não é o mesmo que concluído

Aplique a resolução de conflitos que você já conhece. Antes de retomar o push, confirme:

  • O conteúdo final foi conferido e preserva as mudanças pretendidas dos dois históricos.
  • O commit de merge foi registrado.
  • git status não indica conflitos nem merge em andamento.

Só editar e preparar o arquivo não conclui a integração.

Depois de concluir e conferir

Neste exemplo, a branch se chama main. No seu projeto, use o nome real da branch.

bash
git push origin main

Atenção

O remoto pode avançar novamente

Se alguém publicar novos commits enquanto você resolve o conflito, o push pode sofrer outra rejeição por histórico remoto atualizado. Nesse caso, busque, inspecione e integre as novidades antes de tentar reenviar. Não use envio forçado.

Falta concluir a integração?

Decida o próximo passo

Você conferiu a linha com o horário e a transmissão online e executou git add README.md. O git status informa que todos os conflitos foram resolvidos, mas o merge ainda está em andamento.

Qual é o próximo passo para retomar o envio com a integração incluída?

Passo 8 de 8

Aplicação final: sincronizar e conferir

Resolva uma rejeição de envio e comprove a sincronização pelo estado, pelo histórico atualizado e pelo conteúdo dos arquivos.

Caso final: o remoto mudou antes do envio

Duas contribuições para o mesmo guia

Você está na branch ajustes-guia, que acompanha origin/ajustes-guia, com a árvore de trabalho limpa.

Seu commit documenta a execução no Linux. Antes do seu envio, uma colega publica instruções para Windows na mesma branch remota. Seu git push origin ajustes-guia é rejeitado por atualização não fast-forward.

Você executa git fetch origin e consulta o histórico com git log --oneline --graph --all --decorate:

Histórico após a nova busca

text
* b7c2e90 (origin/ajustes-guia) Documenta execução no Windows
| * a4f8d21 (HEAD -> ajustes-guia) Documenta execução no Linux
|/
* 62c0d8a Adiciona guia de execução

Exemplo

O resultado precisa atender aos dois sistemas

Os dois commits alteram o mesmo trecho do README.md, então a integração pode parar por conflito.

O guia final deve preservar estas instruções:

  • Linux: execute python3 app.py.
  • Windows: execute py app.py.

Planeje a recuperação e a conferência

Qual sequência você seguiria?

Responda em tópicos, incluindo os comandos principais:

  1. Diagnostique a relação entre os históricos mostrados.
  2. Escolha e justifique: manter busca, inspeção e merge separados ou usar pull --no-rebase.
  3. Explique como prosseguir se houver conflito e quando tentar o push novamente.
  4. Indique as três evidências de conclusão: estado, grafo atualizado e conteúdo dos arquivos.

Não use envio forçado.

Escreva pelo menos 100 caracteres (0/100).

Confira as evidências, não só o envio

Depois do push aceito

Atualize novamente o conhecimento do remoto antes de conferir o alinhamento. Além dos comandos abaixo, abra o README.md: um merge concluído precisa preservar o resultado pretendido das duas contribuições.

Atualizar e inspecionar

bash
git fetch origin
git status
git log --oneline --graph --all --decorate

Exemplo de evidências após a sincronização

Resumo ilustrativo, supondo que o remoto não recebeu outras mudanças:

text
ESTADO
Branch: ajustes-guia
Acompanhamento: sem avanço ou atraso
Árvore de trabalho: limpa; nenhum merge em andamento

HISTÓRICO
*   d9e3a60 (HEAD -> ajustes-guia, origin/ajustes-guia) Integra instruções de execução
|\
| * b7c2e90 Documenta execução no Windows
* | a4f8d21 Documenta execução no Linux
|/
* 62c0d8a Adiciona guia de execução

CONTEÚDO DO README.md
Linux: execute `python3 app.py`.
Windows: execute `py app.py`.

Dica

Alinhados naquele momento

A confirmação vale para o estado remoto conhecido na última busca. Se esse fetch revelar novos commits, diagnostique e integre quando necessário; publique apenas se houver commits locais pendentes. O remoto pode mudar novamente depois da conferência.

Critérios para concluir

Resumo

Seu roteiro de sincronização

  • Busque e diagnostique. Use fetch seguido de inspeção e merge para ter uma pausa; pull --no-rebase encadeia busca e integração.
  • Conclua e confira a integração antes de publicar. Uma nova rejeição por histórico remoto exige outra busca e integração, não envio forçado.
  • Após o envio, faça novo fetch e confira: estado sem pendências, referências alinhadas no grafo com os históricos preservados e arquivos com o conteúdo esperado.

Sincronizar alterações com fetch, pull e push

Parabéns! Você concluiu: Sincronizar alterações com fetch, pull e push

Tutorial concluído! Você praticou como buscar, integrar, publicar e conferir mudanças preservando as contribuições locais e remotas.

Baixe o Aplicativo agora para ter acesso a + de 5000 cursos gratuitos, exercícios, certificado e muito conteúdo sem pagar nada!

  • Cursos online 100% gratuitos do início ao fim

    Milhares de cursos online em vídeo, ebooks e áudiobooks.

  • Mais de 60 mil exercícios gratuitos

    Para testar seus conhecimentos no decorrer dos cursos online

  • Certificado Digital gratuito válido em todo o Brasil

    Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail

Aplicativo Cursa na tela de ebook, na tela de curso em vídeo e na tela de exercícios do curso, mais o certificado de conclusão de curso