Como Verificar se uma Branch Git Local Está à Frente da Branch Remota

GitBeginner
Pratique Agora

Introdução

Neste laboratório, aprenderemos como verificar se sua branch Git local está à frente de sua branch remota correspondente. Esta é uma habilidade crucial para entender o estado do seu repositório antes de enviar (push) as alterações. Exploraremos dois métodos principais: usar git status para ver o status "ahead" (à frente) e usar git log com a sintaxe @{u}..HEAD para visualizar os commits específicos que estão à frente.

Através de exercícios práticos, simularemos a realização de commits locais e, em seguida, usaremos esses comandos para observar como o Git indica que nossa branch local divergiu da remota. Finalmente, testaremos esses métodos com branches sincronizadas para ver a saída esperada quando nenhum commit estiver à frente.

Verificar o Status 'Ahead' com git status

Nesta etapa, aprenderemos como verificar o status do nosso repositório Git, focando especificamente em como o Git nos informa se nossa branch local está "ahead" (à frente) de uma branch remota. Este é um cenário comum quando você fez commits localmente, mas ainda não os enviou (push) para um repositório remoto.

Primeiro, vamos garantir que estamos no diretório do nosso projeto. Abra seu terminal e navegue até o diretório my-time-machine:

cd ~/project/my-time-machine

Agora, vamos criar um novo arquivo e adicionar algum conteúdo a ele. Simularmos a realização de uma alteração que eventualmente faremos commit.

echo "Another message for the future" >> message.txt

Este comando anexa o texto "Another message for the future" ao nosso arquivo message.txt existente.

Em seguida, vamos preparar essa alteração usando git add:

git add message.txt

Agora, vamos criar um novo commit com uma mensagem descrevendo a alteração:

git commit -m "Add another message"

Você deve ver uma saída semelhante a esta, indicando que um novo commit foi criado:

[master 1a2b3c4] Add another message
 1 file changed, 1 insertion(+)

Ótimo! Agora fizemos um novo commit em nossa branch master local. No entanto, este commit existe apenas localmente. Se tivéssemos um repositório remoto (como no GitHub ou GitLab), este commit ainda não estaria lá.

Vamos verificar o status do nosso repositório novamente usando git status:

git status

Desta vez, a saída será ligeiramente diferente. Você deve ver algo assim:

On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

Observe a linha Your branch is ahead of 'origin/master' by 1 commit.. Isso é o Git nos dizendo que nossa branch master local tem um commit que não está presente na branch origin/master (que representa a branch master em um repositório remoto hipotético chamado origin).

Este status "ahead" (à frente) é um indicador chave de que você tem alterações locais que precisam ser enviadas (pushed) para o repositório remoto para serem compartilhadas com outras pessoas ou para fazer backup remotamente. Entender este status é crucial para colaborar com outras pessoas e manter seus repositórios local e remoto sincronizados.

Usar git log @{u}..HEAD para Commits à Frente

Na etapa anterior, vimos que git status nos informou que nossa branch local estava "ahead" (à frente) da branch de rastreamento remota. Mas como podemos ver quais commits estão à frente? O Git fornece uma maneira poderosa de comparar branches usando git log.

A sintaxe @{u}..HEAD é uma abreviação no Git. @{u} se refere à branch upstream (a branch de rastreamento remota que sua branch atual está configurada para rastrear, como origin/master), e HEAD se refere ao topo da sua branch local atual. Portanto, @{u}..HEAD significa "mostre-me os commits que estão na minha branch atual (HEAD) mas não na branch upstream (@{u})".

Vamos tentar este comando em nosso terminal. Certifique-se de que você ainda está no diretório ~/project/my-time-machine:

cd ~/project/my-time-machine
git log @{u}..HEAD

Você deve ver a entrada do log para o commit que acabamos de fazer na etapa anterior:

commit 1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0 (HEAD -> master, origin/master)
Author: Jane Doe <jane.doe@example.com>
Date:   Mon Aug 7 10:00:00 2023 +0000

    Add another message

(Observação: O hash do commit e a data serão diferentes na sua saída, mas a mensagem do commit deve ser a mesma.)

Este comando é incrivelmente útil para ver exatamente quais alterações você está prestes a enviar (push) para um repositório remoto. Ele ajuda você a revisar seu trabalho e garantir que você está enviando apenas os commits pretendidos.

A sintaxe @{u}..HEAD é um exemplo específico da notação de intervalo do Git para git log. Você pode usar uma sintaxe semelhante para comparar quaisquer dois commits ou branches. Por exemplo, branch1..branch2 mostra os commits em branch2 que não estão em branch1.

Entender como usar git log com notação de intervalo oferece controle preciso sobre a visualização do histórico do seu projeto e a comparação de diferentes estados do seu repositório.

Pressione q para sair da visualização do log e retornar à linha de comando.

Testar com Branches Sincronizados

Nas etapas anteriores, vimos o que acontece quando nossa branch local está à frente da branch de rastreamento remota. Agora, vamos ver o que git status e git log @{u}..HEAD mostram quando nossa branch local está sincronizada com a branch de rastreamento remota.

Como não temos um repositório remoto real neste ambiente de laboratório, podemos simular estar sincronizados removendo o commit que acabamos de fazer. Em um cenário real, estar sincronizado significaria que você enviou (pushed) seus commits locais para o repositório remoto.

Podemos usar git reset para mover o ponteiro da nossa branch local de volta para o commit anterior. Tenha cuidado com git reset em projetos reais, pois ele pode descartar alterações! Para este laboratório, é seguro porque estamos apenas simulando um estado.

Certifique-se de que você está no diretório ~/project/my-time-machine:

cd ~/project/my-time-machine

Agora, vamos redefinir nossa branch para o commit anterior ao último. Podemos usar HEAD~1 para se referir ao commit antes do HEAD atual.

git reset --hard HEAD~1

Você deve ver uma saída semelhante a esta, indicando que o HEAD foi movido para trás e o diretório de trabalho foi atualizado:

HEAD is now at a1b2c3d Send a message to the future

(Observação: O hash do commit corresponderá ao hash do seu primeiro commit.)

Agora que redefinimos nossa branch local para o estado do primeiro commit, vamos verificar o status novamente:

git status

Desta vez, a saída deve indicar que sua branch está atualizada com a branch de rastreamento remota:

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

nothing to commit, working tree clean

A mensagem Your branch is up to date with 'origin/master'. nos diz que nossa branch master local está sincronizada com a branch de rastreamento remota.

Finalmente, vamos usar git log @{u}..HEAD novamente para ver se há algum commit à frente:

git log @{u}..HEAD

Este comando não deve produzir nenhuma saída, porque não há commits em nossa branch local (HEAD) que também não estejam na branch upstream (@{u}).

Isso confirma que nossa branch local agora está sincronizada com a branch de rastreamento remota. Entender a saída de git status e usar git log @{u}..HEAD são habilidades essenciais para gerenciar seu fluxo de trabalho Git e colaborar de forma eficaz.

Resumo

Neste laboratório, aprendemos como verificar se uma branch Git local está à frente de sua branch remota correspondente. Começamos fazendo um commit local e, em seguida, usamos git status para observar a mensagem de status "ahead" (à frente), que indica que a branch local contém commits que ainda não estão presentes no remoto.

Também exploramos o uso de git log @{u}..HEAD para listar especificamente os commits que estão à frente da branch de rastreamento remota, fornecendo uma visão mais detalhada das diferenças. Finalmente, testamos o comportamento com branches sincronizadas para confirmar que git status relata que as branches estão atualizadas quando não há commits locais à frente do remoto.