Como Verificar se um Branch Git Divergiu do Remoto

GitBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como verificar se seu branch Git local divergiu de sua contraparte remota. Esta é uma habilidade fundamental para o desenvolvimento colaborativo e para manter-se atualizado com as mudanças do projeto.

Começaremos buscando atualizações de um repositório remoto simulado e usando git status para identificar se seu branch local está atrasado. Em seguida, você explorará como usar git log para comparar commits entre seus branches local e remoto e, finalmente, verificará a divergência usando git diff @{u} HEAD.

Buscar (Fetch) e Verificar git status para Divergência

Nesta etapa, aprenderemos como verificar se há alguma alteração no repositório remoto que não temos localmente. Isso é crucial ao colaborar com outras pessoas ou ao trabalhar em um projeto que é atualizado em outro lugar.

Primeiro, vamos simular ter um repositório remoto com algumas alterações. Em um cenário do mundo real, este seria um repositório hospedado em uma plataforma como GitHub ou GitLab. Para este laboratório, usaremos um diretório local para atuar como nosso "remoto".

Navegue de volta para o diretório do seu projeto, se você ainda não estiver lá:

cd ~/project/my-time-machine

Agora, vamos buscar as últimas alterações do remoto simulado. Usaremos o comando git fetch. Este comando baixa commits, arquivos e refs de um repositório remoto para seu repositório local. Ele não os mescla em seu branch atual.

git fetch origin

Você pode não ver muita saída se não houver novas alterações. No entanto, git fetch atualiza as informações sobre os branches remotos em seu repositório local.

Em seguida, usaremos git status para ver se nosso branch local está atrasado em relação ao branch remoto. O comando git status é sua janela para o estado atual do seu repositório. Ele informa sobre arquivos staged, unstaged e untracked, e também fornece informações sobre a relação entre seu branch atual e seu branch upstream.

Execute o comando git status:

git status

Se houver alterações no remoto que você acabou de buscar, a saída de git status indicará que seu branch local está atrasado em relação ao branch remoto. Pode parecer algo assim:

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

Esta mensagem informa que seu branch master local está um commit atrás do branch origin/master (a versão remota do branch master). Ele também sugere o uso de git pull para atualizar seu branch local, o que abordaremos em um laboratório posterior.

Compreender a saída de git status após a busca é importante porque permite que você saiba se há novas alterações disponíveis no repositório remoto antes de decidir integrá-las ao seu trabalho local. Isso ajuda a evitar possíveis conflitos e mantém você informado sobre o progresso do projeto.

Usar git log para Comparar Commits

Na etapa anterior, usamos git status para ver se nosso branch local estava atrasado em relação ao remoto. Agora, vamos usar git log para ver os commits reais que estão no branch remoto, mas não em nosso branch local.

O comando git log é incrivelmente versátil. Ele permite que você visualize o histórico de commits de várias maneiras diferentes. Para comparar nosso branch local (HEAD) com o branch de rastreamento remoto (origin/master), podemos usar a seguinte sintaxe:

git log HEAD..origin/master

Certifique-se de estar no diretório ~/project/my-time-machine:

cd ~/project/my-time-machine

Agora, execute o comando git log para comparar os branches:

git log HEAD..origin/master

Se houver commits em origin/master que não estão em seu HEAD local (que atualmente está apontando para seu branch master local), este comando listará esses commits. A saída mostrará os detalhes do commit, incluindo o hash do commit, autor, data e mensagem do commit, para cada commit que existe em origin/master, mas não em seu branch atual.

Por exemplo, se o remoto tiver um novo commit, a saída poderá ser semelhante a esta:

commit abcdef1234567890abcdef1234567890abcdef (origin/master)
Author: Another User <another.user@example.com>
Date:   Tue Aug 8 10:00:00 2023 +0000

    Add a new feature

Esta saída mostra claramente o commit que está presente no remoto, mas não localmente. A sintaxe HEAD..origin/master diz ao Git para mostrar os commits que são alcançáveis a partir de origin/master, mas não a partir de HEAD.

Usar git log dessa maneira é uma ferramenta poderosa para entender as diferenças entre os branches e ver exatamente quais alterações você obteria se atualizasse seu branch local. Ele fornece mais detalhes do que git status sobre os commits específicos que estão causando a divergência.

Lembre-se de pressionar q para sair da visualização do log se ela abrir em um pager.

Verificar com git diff @{u} HEAD

Nas etapas anteriores, usamos git status para ver se nosso branch local estava atrasado em relação ao remoto e git log para ver os commits que eram diferentes. Agora, vamos usar git diff para ver as alterações reais no código introduzidas por esses commits no branch remoto em comparação com nosso branch local.

O comando git diff mostra as diferenças entre dois pontos no seu histórico do Git. Podemos usá-lo para comparar nosso branch local atual (HEAD) com seu branch upstream. O branch upstream é o branch no repositório remoto que seu branch local está rastreando. Em nosso caso, o branch upstream para master é origin/master. O Git fornece uma abreviação conveniente para o branch upstream: @{u} ou @{upstream}.

Certifique-se de estar no diretório ~/project/my-time-machine:

cd ~/project/my-time-machine

Agora, execute o comando git diff para ver as diferenças entre seu branch local e seu branch upstream:

git diff @{u} HEAD

Este comando mostrará as diferenças linha por linha entre os arquivos em seu commit atual (HEAD) e os arquivos no último commit no branch upstream (@{u}).

Se houver alterações no remoto que você ainda não puxou, a saída mostrará essas diferenças. Por exemplo, se uma linha foi adicionada a message.txt no remoto, a saída poderá ser semelhante a esta:

diff --git a/message.txt b/message.txt
index a1b2c3d..e4f5g6h 100644
--- a/message.txt
+++ b/message.txt
@@ -1 +1,2 @@
 Hello, Future Me
+This is a new line from the remote.

O sinal + indica as linhas que estão presentes no branch upstream (@{u}) mas não em seu branch local (HEAD).

Usar git diff @{u} HEAD é uma maneira poderosa de visualizar as alterações que existem no remoto antes de mesclá-las em seu branch local. Ele permite que você entenda as modificações exatas que foram feitas, o que é muito útil para revisões de código ou simplesmente para se manter informado sobre a evolução do projeto.

Pressione q para sair da visualização de diff se ela abrir em um pager.

Resumo

Neste laboratório, aprendemos como verificar se um branch Git local divergiu de sua contraparte remota. Começamos simulando um repositório remoto e usando git fetch para recuperar as últimas alterações sem mesclá-las. Posteriormente, utilizamos git status para identificar rapidamente se nosso branch local estava atrasado em relação ao remoto, o que é indicado por mensagens como "Your branch is behind 'origin/master' by X commit" (Seu branch está atrás de 'origin/master' por X commit).

Após a verificação inicial com git status, exploramos métodos mais detalhados para comparar branches. Aprendemos a usar git log com várias opções para visualizar o histórico de commits e identificar diferenças entre os branches local e remoto. Finalmente, descobrimos a utilidade de git diff @{u} HEAD para uma comparação precisa das alterações entre o branch upstream e o HEAD atual, fornecendo uma visão clara da divergência.