Git reset = recuar no tempo ao anular commits.
Conceito:
Analogia: é como apagar páginas de um caderno.
| Modo | Commits | Index/Staging | Working Directory |
|---|---|---|---|
| --soft | Anula | Conserva | Conserva |
| --mixed | Anula | Apaga | Conserva |
| --hard | Anula | Apaga | Apaga |
Memo simples:
Uso: refazer o último commit com mais alterações.
mkdir demo-reset && cd demo-reset
git init
echo "print('v1')" > app.py && git add . && git commit -m "Version 1"
echo "print('v2')" > app.py && git add . && git commit -m "Version 2"
# Reset soft: anula o commit, guarda tudo em staging
git reset --soft HEAD~1
git status # Alterações staged prontas
git log --oneline # Um commit a menos
cat app.py # Conteúdo v2 ainda lá
# Novo commit com mensagem melhorada
git commit -m "Version 2 - Avec nouvelles features"Uso: anular commits E retirar do staging (modo por omissão).
echo "print('v3')" > app.py && git add . && git commit -m "Version 3"
# Reset mixed (ou simplesmente git reset)
git reset HEAD~1
git status # Alterações NÃO staged
git log --oneline # Commits anulados
cat app.py # Conteúdo v3 ainda lá, mas não staged
# É preciso voltar a add antes do commit
git add . && git commit -m "Version 3 - Refait proprement"PERIGO: apaga TUDO, até as modificações sem commit!
echo "print('v4')" > app.py && git add . && git commit -m "Version 4"
# Modificações em curso
echo "print('work in progress')" >> app.py
# Reset hard: TUDO DESAPARECE
git reset --hard HEAD~1
git status # Working directory clean
cat app.py # Voltou a v2, work in progress PERDIDO!Uso: quando quer MESMO deitar tudo fora e recuar.
Reset é DESTRUTIVO com commits partilhados!
NUNCA faça isto:
git push origin main # Commits partilhados com a equipa
git reset --hard HEAD~3 # Apaga 3 commits partilhados
git push --force # Força a eliminação em toda a gente
# = CAOS na equipa!Regra de segurança:
git revert (mais seguro)| Comando | Ação |
|---|---|
git reset HEAD~1 | Anula 1 commit (mixed) |
git reset --soft HEAD~2 | Anula 2 commits, guarda o staging |
git reset --hard HEAD~1 | Anula 1 commit, apaga TUDO |
git reset <hash> | Voltar a um commit específico |
git reset --hard origin/main | Reset na versão remota |
Reset = poderoso mas perigoso. Use com precaução!