Introdução
Neste laboratório, você aprenderá a lidar com um cenário comum do Git: quando seu branch local está adiantado em relação ao repositório remoto. Essa situação ocorre quando você faz commits localmente, mas ainda não os enviou (push) para o repositório remoto. Ao final deste laboratório, você entenderá como identificar quando seu branch está adiantado em relação ao remoto e como sincronizar seus repositórios local e remoto corretamente.
Fazendo Alterações Locais
Nesta etapa, você fará alterações no seu repositório local que ainda não foram enviadas (pushed) para o repositório remoto, criando o cenário de "adiantado em relação ao origin" (ahead of origin).
Configurando o Repositório
Primeiro, precisamos configurar um repositório com o qual possamos trabalhar. Usaremos o repositório git-playground como nosso ponto de partida. Como você precisa de permissões de push para completar este laboratório, você precisará criar um fork do repositório primeiro.
Criando um Fork do Repositório
- Visite https://github.com/labex-labs/git-playground no seu navegador
- Clique no botão "Fork" no canto superior direito para criar sua própria cópia do repositório
- Após criar o fork, anote seu nome de usuário do GitHub - você precisará dele para a próxima etapa
Clonando Seu Repositório Forkado
Agora, vamos clonar seu repositório forkado para sua máquina local. Substitua YOUR_USERNAME pelo seu nome de usuário real do GitHub:
cd ~/project
git clone https://github.com/YOUR_USERNAME/git-playground.git
cd git-playground
Após clonar, verifique se o repositório remoto está configurado corretamente:
git remote -v
Você deverá ver uma saída mostrando seu repositório forkado como o remote origin:
origin https://github.com/YOUR_USERNAME/git-playground.git (fetch)
origin https://github.com/YOUR_USERNAME/git-playground.git (push)
Entendendo Repositórios Locais e Remotos
O Git opera com um modelo distribuído onde cada desenvolvedor tem uma cópia completa do repositório em sua máquina local. As alterações feitas localmente precisam ser sincronizadas explicitamente com o repositório remoto.
Agora, vamos verificar o status atual do nosso repositório:
git status
Você deverá ver uma saída semelhante a esta:
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
Isso significa que seu repositório local está atualmente sincronizado com o repositório remoto.
Criando um Novo Arquivo
Vamos criar um novo arquivo em nosso repositório:
echo "This is a new file for our project." > new_file.txt
Após criar o arquivo, precisamos adicioná-lo à área de staging (staging area) do Git:
git add new_file.txt
Agora, vamos commitar este arquivo para o nosso repositório local:
git commit -m "Add new_file.txt"
Você deverá ver uma saída confirmando seu commit:
[master 1a2b3c4] Add new_file.txt
1 file changed, 1 insertion(+)
create mode 100644 new_file.txt
Verificando o Status do Branch
Agora que fizemos um commit local, vamos verificar o status do nosso repositório novamente:
git status
Desta vez, você deverá ver:
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
Esta mensagem indica que seu branch local tem um commit que ainda não foi enviado para o repositório remoto. Esta é exatamente a situação que queríamos criar - seu branch agora está "adiantado em relação ao origin".
Visualizando Diferenças de Branch
Agora que seu branch local está adiantado em relação ao branch remoto, vamos explorar como visualizar as diferenças específicas entre seus branches local e remoto.
Entendendo as Referências de Branch
No Git, você se refere ao branch remoto usando o formato origin/nome-do-branch. O termo origin é o nome padrão para o repositório remoto, e nome-do-branch é o nome do branch (no nosso caso, é master).
Visualizando Diferenças de Commits
Para ver os commits que existem no seu branch local, mas não no branch remoto, use o seguinte comando:
git log origin/master..HEAD
A saída mostrará o(s) commit(s) que estão no seu branch local (HEAD), mas não no branch remoto (origin/master):
commit 1a2b3c4d... (HEAD -> master)
Author: LabEx User <labex@example.com>
Date: ...
Add new_file.txt
Visualizando Diferenças de Arquivos
Para ver quais arquivos diferem entre seus branches local e remoto, use:
git diff --name-status origin/master..HEAD
A saída deve mostrar:
A new_file.txt
Isso indica que new_file.txt foi adicionado no seu branch local, mas não existe no branch remoto.
Entendendo a Visualização da Diferença
Para ver as diferenças reais de conteúdo, você pode usar:
git diff origin/master..HEAD
Isso mostrará as alterações específicas feitas em cada arquivo:
diff --git a/new_file.txt b/new_file.txt
new file mode 100644
index 0000000..3b2aed8
--- /dev/null
+++ b/new_file.txt
@@ -0,0 +1 @@
+This is a new file for our project.
Estes comandos ajudam você a entender exatamente quais alterações estão no seu branch local que ainda não foram enviadas (pushed) para o repositório remoto.
Enviando Alterações para o Remoto (Pushing Changes to Remote)
Agora que você entendeu quais alterações estão presentes no seu branch local, é hora de sincronizar seu repositório local com o repositório remoto enviando suas alterações.
Entendendo o Git Push
O comando git push envia seus commits locais para o repositório remoto. Ao fazer o push, você sincroniza o branch remoto com seu branch local, tornando ambos os branches idênticos.
Enviando Suas Alterações
Para enviar seus commits locais para o repositório remoto, use:
git push origin master
Você deverá ver uma saída semelhante a esta:
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 324 bytes | 324.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/YOUR_USERNAME/git-playground.git
abcd123..1a2b3c4 master -> master
A saída mostra:
- O Git contou e comprimiu os objetos no seu commit
- As alterações foram enviadas com sucesso para o repositório remoto
- Os identificadores (hashes) de commit antigos e novos
- O branch que foi atualizado (
master -> master)
Verificando o Push
Vamos verificar o status do nosso repositório novamente:
git status
Agora você deverá ver:
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
Isso confirma que seu branch local agora está sincronizado com o branch remoto. A mensagem "ahead of origin" desapareceu porque ambos os branches agora contêm os mesmos commits.
Verificando o Conteúdo do Repositório Remoto
Podemos verificar se nossas alterações estão agora no repositório remoto examinando o log do branch remoto:
git log origin/master -1
Este comando mostra o commit mais recente no branch remoto, que agora deve incluir nosso novo arquivo:
commit 1a2b3c4d... (HEAD -> master, origin/master)
Author: LabEx User <labex@example.com>
Date: ...
Add new_file.txt
Note que tanto HEAD -> master quanto origin/master apontam para o mesmo commit agora, confirmando que ambos os branches estão sincronizados.
Criando e Resolvendo Múltiplos Commits Adiantados (Ahead)
Em cenários do mundo real, você pode ter múltiplos commits adiantados em relação ao seu branch remoto. Vamos criar essa situação e aprender como resolvê-la.
Fazendo Múltiplos Commits Locais
Vamos criar e commitar várias alterações:
## Create a second file
echo "This is the second file." > second_file.txt
git add second_file.txt
git commit -m "Add second_file.txt"
## Modify the README
echo "### Additional Information" >> README.md
echo "This project demonstrates Git branch synchronization." >> README.md
git add README.md
git commit -m "Update README with additional information"
Agora vamos verificar nosso status:
git status
Você deverá ver:
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
Visualizando Múltiplas Diferenças de Commits
Vamos ver quais commits temos localmente que não estão no remoto:
git log origin/master..HEAD --oneline
Você deverá ver seus dois novos commits:
abcd123 Update README with additional information
efgh456 Add second_file.txt
Enviando Múltiplos Commits (Pushing Multiple Commits)
Para sincronizar todos os seus commits locais com o repositório remoto, use o mesmo comando de push:
git push origin master
A saída mostrará ambos os commits sendo enviados (pushed):
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 2 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 574 bytes | 574.00 KiB/s, done.
Total 5 (delta 1), reused 0 (delta 0), pack-reused 0
To https://github.com/YOUR_USERNAME/git-playground.git
1a2b3c4..abcd123 master -> master
Verificando se Todos os Commits Foram Enviados (Pushed)
Vamos verificar nosso status novamente:
git status
Você deverá ver:
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
Isso confirma que todos os seus commits locais foram enviados com sucesso para o repositório remoto.
Resumo
Neste laboratório (lab), você aprendeu a lidar com situações em que seu branch Git local está adiantado em relação ao branch remoto. Você realizou com sucesso:
- A criação de um commit local que deixou seu branch adiantado em relação ao branch remoto.
- O uso de comandos Git para visualizar as diferenças específicas entre seus branches local e remoto.
- O envio (push) de suas alterações para sincronizar seus repositórios local e remoto.
- A criação de múltiplos commits localmente e o envio de todos eles de uma só vez para o branch remoto.
Essas habilidades são essenciais para o fluxo de trabalho diário do Git, pois ajudam você a manter seus repositórios local e remoto sincronizados, o que é crucial para uma colaboração eficaz em projetos de desenvolvimento de software. Lembre-se de que manter seus branches sincronizados regularmente ajuda a prevenir conflitos e torna a colaboração mais tranquila.



