Missão: criar um projeto, fazer 3 commits, corrigir o último.
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"
Missão: 2 features em paralelo, fundir com limpeza.
# 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-apiVerificação: git log --graph --oneline → ver os merges
Missão: o mesmo cenário, 2 estratégias diferentes.
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 mergemkdir 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 linearPergunta: que diferença vê em git log?
Missão: fazer malabarismo com várias tarefas.
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?
Missão: simular uma urgência com reset.
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-v4Lição: Revert = seguro para produção, Reset = OK para local
Consegue fazer tudo isto em 15 minutos?
Se sim → domina o Git!