Como Verificar se um Repositório Git Está Sincronizado com o Remoto

GitBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como verificar se seu repositório Git local está sincronizado com sua contraparte remota. Exploraremos métodos práticos para determinar se sua branch local está atualizada, atrasada ou à frente da branch remota.

O laboratório irá guiá-lo através da obtenção (fetching) de alterações de um repositório remoto e do uso de git status para avaliar o estado de sincronização. Você também aprenderá como usar git log para comparar seu HEAD local com a branch de rastreamento remota (@{u}) para identificar diferenças no histórico de commits. Finalmente, simularemos e examinaremos o status de repositórios que divergiram, fornecendo uma compreensão abrangente de como identificar e gerenciar problemas de sincronização no Git.

Fetch e Verificar git status

Nesta etapa, aprenderemos como obter (fetch) alterações de um repositório remoto e verificar o status do nosso repositório local.

Imagine que você está trabalhando em um projeto com outras pessoas. Elas podem fazer alterações no projeto e salvá-las em um local central (um repositório remoto). Você precisa de uma maneira de obter essas alterações em sua própria cópia do projeto (seu repositório local). É aqui que o git fetch entra em ação.

Primeiro, vamos garantir que estamos no diretório do nosso projeto. Abra seu terminal e digite:

cd ~/project/my-time-machine

Agora, vamos simular ter um repositório remoto. Em um cenário real, isso estaria em uma plataforma como GitHub ou GitLab. Para este laboratório, usaremos um diretório local como nosso "remoto".

git remote add origin ../my-time-machine-remote

Este comando adiciona um "remoto" chamado origin apontando para um diretório fora do nosso projeto atual.

Agora, vamos usar git fetch para obter quaisquer alterações deste remoto simulado.

git fetch origin

Você pode não ver muita saída se não houver novas alterações, mas este comando entrou em contato com o repositório remoto e baixou qualquer informação nova, como commits e branches, sem mesclá-las em sua branch atual.

Após o fetch, é sempre uma boa ideia verificar o status do seu repositório local para ver se há alguma alteração do remoto que você ainda não incorporou.

git status

A saída de git status agora informará se sua branch local está "up to date" (atualizada) com a branch remota, ou se há alterações disponíveis para serem puxadas (pulled). Por exemplo, você pode ver algo como:

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

Ou, se houver alterações no remoto:

On branch master
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)

nothing to commit, working tree clean

Compreender a saída de git status após um git fetch é crucial. Ele informa a relação entre sua branch local e a branch correspondente no repositório remoto. Isso ajuda você a decidir se precisa puxar (pull) as alterações ou se sua cópia local já está atualizada.

Usar git log para Comparar HEAD e @{u}

Nesta etapa, usaremos o comando git log para comparar o estado da nossa branch local (HEAD) com sua branch upstream (@{u}). Esta é uma maneira poderosa de visualizar as diferenças após obter (fetching) as alterações.

Primeiro, certifique-se de estar no diretório do seu projeto:

cd ~/project/my-time-machine

No Git, HEAD se refere ao commit ao qual sua branch atual está apontando. Ele representa o topo do seu trabalho atual. @{u} (ou @\{upstream\}) se refere à branch upstream que sua branch local atual está rastreando. Esta é tipicamente a branch correspondente no repositório remoto do qual você fez o fetch.

Para ver os commits que estão em sua branch local (HEAD) mas não na branch upstream (@{u}), você pode usar o seguinte comando:

git log HEAD..@{u}

Este comando mostra os commits que são alcançáveis a partir de @{u} mas não a partir de HEAD. Em outras palavras, ele mostra os commits que estão na branch remota, mas ainda não em sua branch local. Se não houver tais commits (o que significa que sua branch local está atualizada ou à frente), este comando não produzirá nenhuma saída.

Agora, vamos ver os commits que estão na branch upstream (@{u}) mas não em sua branch local (HEAD). Isso mostra os commits que estão em sua branch local, mas ainda não foram enviados (pushed) para o remoto.

git log @{u}..HEAD

Este comando mostra os commits que são alcançáveis a partir de HEAD mas não a partir de @{u}. Se não houver tais commits (o que significa que sua branch local está atualizada ou atrasada), este comando não produzirá nenhuma saída.

Ao usar git log com a notação .., você pode facilmente comparar o histórico de dois pontos diferentes em seu repositório, como sua branch local e sua contraparte upstream. Isso é incrivelmente útil para entender o estado do seu repositório em relação ao remoto e para se preparar para puxar (pull) ou enviar (push) alterações.

Testar Repositórios Divergentes

Nesta etapa, simularemos um cenário em que tanto seu repositório local quanto o repositório remoto têm novos commits que o outro não possui. Isso é conhecido como um estado "divergente".

Primeiro, certifique-se de estar no diretório do seu projeto:

cd ~/project/my-time-machine

Vamos criar um novo commit em nosso repositório local:

echo "Adding a local change" > local_change.txt
git add local_change.txt
git commit -m "Add a local change"

Agora, vamos simular um commit sendo feito diretamente no repositório "remoto". Vamos mudar para o diretório remoto, fazer um commit e, em seguida, voltar.

cd ../my-time-machine-remote
echo "Adding a remote change" > remote_change.txt
git add remote_change.txt
git commit -m "Add a remote change"
cd ../my-time-machine

Agora criamos um commit em nosso repositório local e um commit separado no repositório remoto simulado. Nossos repositórios agora estão divergentes.

Vamos usar git fetch novamente para atualizar nosso conhecimento do repositório remoto:

git fetch origin

Agora, verifique o status do seu repositório local:

git status

Você deve ver uma saída indicando que sua branch divergiu. Algo como isto:

On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

nothing to commit, working tree clean

Esta mensagem de status informa que sua branch local (master) e a branch de rastreamento remota (origin/master) avançaram com novos commits desde a última vez que estavam sincronizadas. Ela até sugere o uso de git pull para mesclar as alterações remotas.

Compreender o estado divergente é importante porque é um cenário comum ao colaborar com outras pessoas. Isso significa que você precisa integrar as alterações remotas em sua branch local antes de poder enviar (push) suas próprias alterações.

Resumo

Neste laboratório, aprendemos como verificar se um repositório Git local está sincronizado com sua contraparte remota. Começamos simulando um repositório remoto e adicionando-o ao nosso projeto local usando git remote add. A etapa crucial de obter (fetching) as alterações do remoto sem mesclá-las foi realizada usando git fetch origin. Após o fetch, usamos git status para determinar o estado de sincronização de nossa branch local em relação à branch remota, observando a saída que indica se a branch está atualizada ou atrasada.

Exploraremos ainda mais os métodos para comparar o HEAD local com a branch de rastreamento remota usando git log e examinaremos cenários envolvendo repositórios divergentes para obter uma compreensão abrangente da sincronização do repositório.