Exercícios Git - Teste Prático

1 min

Índice

  1. Exercício 1: Basics
  2. Exercício 2: Branches
  3. Exercício 3: Merge vs Rebase
  4. Exercício 4: Stash e Cherry-pick
  5. Exercício 5: Urgência e Reset

Exercício 1: Basics

Missão: criar um projeto, fazer 3 commits, corrigir o último.

bash
mkdir test-git && cd test-git && git init

# 3 commits
echo "print('v1')" > app.py && git add . && git commit -m "Version 1"
echo "print('v2')" > app.py && git add . && git commit -m "Version 2"  
echo "print('v3 with bug')" > app.py && git add . && git commit -m "Version 3"

# Corrigir o último commit
echo "print('v3 fixed')" > app.py && git add . && git commit --amend -m "Version 3 - Fixed"

Verificação: git log --oneline → 3 commits, o último diz "Fixed"

Voltar ao índice

Exercício 2: Branches

Missão: 2 features em paralelo, fundir com limpeza.

bash
# Base
echo "print('main')" > main.py && git add . && git commit -m "Main app"

# Feature 1  
git checkout -b feature-login
echo "print('login')" > login.py && git add . && git commit -m "Add login"

# Feature 2
git checkout main && git checkout -b feature-api
echo "print('api')" > api.py && git add . && git commit -m "Add API"

# Fundir tudo em main
git checkout main
git merge feature-login
git merge feature-api

# Limpar
git branch -d feature-login feature-api

Verificação: git log --graph --oneline → ver os merges

Voltar ao índice

Exercício 3: Merge vs Rebase

Missão: o mesmo cenário, 2 estratégias diferentes.

Estratégia A: Merge

bash
mkdir test-merge && cd test-merge && git init
echo "print('base')" > app.py && git add . && git commit -m "Base"

# Feature branch
git checkout -b feature
echo "print('feature')" > feature.py && git add . && git commit -m "Add feature"

# Main avança
git checkout main
echo "print('base v2')" > app.py && git add . && git commit -m "Update base"

# Merge
git merge feature
git log --graph --oneline    # Ver o histórico com merge

Estratégia B: Rebase

bash
mkdir test-rebase && cd test-rebase && git init
echo "print('base')" > app.py && git add . && git commit -m "Base"

git checkout -b feature  
echo "print('feature')" > feature.py && git add . && git commit -m "Add feature"

git checkout main
echo "print('base v2')" > app.py && git add . && git commit -m "Update base"

# Rebase
git checkout feature && git rebase main
git checkout main && git merge feature
git log --oneline           # Histórico linear

Pergunta: que diferença vê em git log?

Voltar ao índice

Exercício 4: Stash e Cherry-pick

Missão: fazer malabarismo com várias tarefas.

bash
mkdir test-stash && cd test-stash && git init
echo "print('v1')" > app.py && git add . && git commit -m "Version 1"

# Começa a codificar
echo "print('work in progress')" >> app.py

# URGÊNCIA! Tem de mudar
git stash                    # Salvaguardar
git checkout -b hotfix
echo "print('URGENT FIX')" > fix.py && git add . && git commit -m "Critical fix"

# Cherry-pick a correção para main
git checkout main
git cherry-pick <hash-du-fix>

# Voltar ao seu trabalho
git stash pop
echo "print('feature complete')" >> app.py && git add . && git commit -m "Feature done"

Desafio: a correção urgente está em main E em hotfix?

Voltar ao índice

Exercício 5: Urgência e Reset

Missão: simular uma urgência com reset.

bash
mkdir test-urgence && cd test-urgence && git init

# Vários commits
echo "print('v1')" > app.py && git add . && git commit -m "Version 1"
echo "print('v2')" > app.py && git add . && git commit -m "Version 2"  
echo "print('v3')" > app.py && git add . && git commit -m "Version 3"
echo "print('v4 BROKEN')" > app.py && git add . && git commit -m "Version 4 - Bug!"

# Oh não! v4 parte tudo em produção
git log --oneline                    # Anotar o hash de v3

# Solução 1: Reset hard (destrutivo)
git reset --hard <hash-v3>           # Voltar a v3, v4 desaparece
git log --oneline                    # Só 3 commits

# Solução 2: Revert (seguro)  
# Voltar a pôr v4 primeiro
git reset --hard <hash-v4>           # Voltar a v4
git revert HEAD                      # Criar commit que anula v4
git log --oneline                    # 5 commits: v1,v2,v3,v4,revert-v4

Lição: Revert = seguro para produção, Reset = OK para local

Voltar ao índice


DESAFIO FINAL

Consegue fazer tudo isto em 15 minutos?

  1. Projeto com 3 commits
  2. 2 branches com features
  3. 1 merge + 1 rebase
  4. 1 stash + 1 cherry-pick
  5. 1 reset ou revert de urgência

Se sim → domina o Git!

Voltar ao índice