Como desfazer alterações feitas por um agente de programação com IA
Desfaça com segurança as edições de um agente de programação com IA: restaure um ficheiro, descarte o que ficou sem commit ou reverta o commit do agente, sem perder o seu trabalho.
Para desfazer as alterações de um agente de programação com IA, veja o que mudou e use o comando Git correspondente: git restore para ficheiros editados, git clean para ficheiros novos e git revert para um commit. Antes disso, guarde uma cópia de segurança com git stash. O /rewind do próprio Claude Code também consegue restaurar código, mas não acompanha todas as alterações.
Este guia começa depois de ter decidido descartar o trabalho; rever alterações de código feitas por IA ajuda a decidir. O Mono mostra o que mudou, mas não o desfaz, por isso também aí os comandos são os mesmos.
1. Pare o agente e veja o que mudou
Primeiro, pare o agente. No Mono, o botão de enviar passa a ser um botão de cancelar enquanto o agente trabalha. Num terminal na pasta do projeto, execute:
git status
git log --oneline -5O primeiro lista os ficheiros modificados, eliminados, preparados (staged) e novos. O segundo mostra os commits recentes, incluindo os que o agente tenha feito. Anote que alterações são suas: os comandos para desfazer não sabem quem escreveu cada linha.
| O que vê | Como desfazer |
|---|---|
| Ficheiro modificado ou eliminado, não preparado | git restore <path> |
| Alteração preparada | git restore --staged <path> e depois desfaça a alteração no ficheiro |
| Ficheiro novo, não acompanhado pelo Git | git clean -n <path> e depois git clean -f <path> |
| Um commit que não queria | git revert <commit> |
No Mono, «Mostrar alterações» lista os ficheiros modificados e novos desde o último commit, por isso não mostra um commit feito pelo agente.
2. Guarde primeiro uma cópia de segurança
Restaurar e limpar descartam definitivamente o trabalho sem commit, por isso guarde tudo primeiro:
git stash push --include-untracked -m "before undo"
git stash apply --indexO primeiro guarda os ficheiros modificados e novos e limpa a árvore de trabalho; o segundo repõe-nos e mantém o que estava preparado. Nada parece diferente, mas git stash list passa a ter uma cópia chamada «before undo».
Se desfizer demasiado, git restore --source "stash@{0}" <path> recupera um ficheiro editado a partir do stash mais recente.
3. Desfaça um ficheiro ou uma parte dele
Escolha o comando mais restrito:
git restore <path>descarta as edições não preparadas nesse ficheiro.git restore --staged <path>retira uma alteração da área de preparação, mas mantém a edição no ficheiro.git restore -p <path>pergunta por cada parte alterada (hunk) em separado, o que ajuda quando tanto você como o agente editaram o mesmo ficheiro.git clean -n <path>lista os ficheiros não acompanhados quegit clean -f <path>removeria. Indique sempre um caminho.
A documentação do git restore explica cada opção.
4. Desfaça tudo o que o agente deixou sem commit
Se nenhuma das alterações for sua, descarte-as todas a partir da raiz do projeto com git restore --staged --worktree . e depois use git clean -n . e git clean -f . para os ficheiros novos. Caso contrário, trabalhe caminho a caminho.
Eis um exemplo fictício: pediu a um agente que mudasse o nome da classe CSS .btn-primary para .button-main num projeto «tidy-recipes». Antes, ele tinha feito um commit com uma atualização do lockfile que ninguém pediu. Desta vez, alterou a classe em 3 ficheiros, reformatou 12 ficheiros sem relação com a tarefa e criou styles/tokens.css. Entretanto, você editou o README.md à mão e quer manter essa edição.
Depois da cópia de segurança, restaure os ficheiros do agente (aqui, src/ e styles/main.css) e remova o ficheiro novo que ele criou:
git restore src/ styles/main.css
git clean -n styles/tokens.css
git clean -f styles/tokens.cssNão use git restore . aqui: também descartaria a sua edição do README. Se tivesse edições dentro de src/, teria de indicar os ficheiros do agente um a um.
Agora git status lista apenas README.md, e git diff mostra apenas as suas linhas. O commit do lockfile continua lá.
5. Desfaça um commit que o agente já fez
git revert regista um commit novo que inverte um anterior. A documentação do git revert diz que precisa de uma árvore de trabalho limpa, por isso ponha primeiro de lado a sua edição do README:
git stash push -m "readme" README.md
git revert <lockfile commit>
git stash popUse o hash que aparece em git log e acrescente --no-edit para saltar o editor da mensagem. git stash pop recupera «readme» e deixa «before undo» na lista. Agora git status lista apenas README.md, e git log --oneline mostra Revert "Update lockfile" no topo.
Para um commit já enviado com push, prefira o revert ao git reset, que reescreve um histórico que outras pessoas podem já ter. Se um commit parecer perdido depois de um reset ou de um rebase, git reflog lista os commits em que esteve recentemente, com os respetivos hashes.
6. Use os checkpoints do agente, com o Git como rede de segurança
O Claude Code guarda um checkpoint antes de cada pedido: execute /rewind, ou prima Esc duas vezes com a caixa de texto vazia, para restaurar o código, a conversa ou ambos. A documentação sobre checkpoints indica os limites: as alterações feitas por comandos de shell não são acompanhadas, as edições feitas fora do agente normalmente não ficam registadas e os checkpoints não substituem o controlo de versões. A disponibilidade também depende da aplicação em que corre o agente.
Por isso, faça do Git a sua rede de segurança:
- Faça um commit ou crie um ramo antes de cada tarefa, para que «o último commit» signifique «antes do agente».
- Diga ao agente que não faça commits sem perguntar, por exemplo no seu ficheiro AGENTS.md.
- Mantenha as aprovações ativas. O Modo YOLO do Mono, que aceita todos os pedidos do agente, está desativado por predefinição. Consulte o que verificar antes de permitir.
No Mono, o cartão de um projeto abre um terminal na pasta do projeto no seu computador, também a partir do telemóvel (consulte o guia de programação remota). O Mono ainda não está disponível, mas pode inscrever-se na lista de espera.
