W3docs

git revert

Aprenda sobre o comando git revert, a diferença entre git revert e git reset, as opções disponíveis e exemplos de uso práticos.

git revert

Esta página explica o que o git revert faz, as opções que ele aceita, um exemplo completo passo a passo, como ele difere do git reset, como reverter um commit de merge e como resolver os conflitos que um revert pode produzir.

Descrição

O comando git revert é uma operação de desfazer que avança no histórico. Ao contrário de comandos como git reset, ele não reescreve o histórico. Em vez de excluir ou mover commits, ele calcula o inverso das alterações introduzidas por um commit alvo e registra esse inverso como um novo commit no topo da branch atual.

Como nada é removido do histórico, o git revert é a forma segura de desfazer trabalho que você já enviou para um repositório compartilhado: todos que têm o commit original o mantêm, e o revert simplesmente adiciona um commit subsequente que o cancela. Isso preserva o histórico completo de revisões, o que importa para auditabilidade e colaboração limpa.

Alguns pontos a considerar:

  • Um revert precisa de uma referência de commit para saber o que desfazer. Executar git revert sem argumento falha.
  • Um revert deixa a árvore de trabalho no estado em que estaria se aquele commit nunca tivesse acontecido (em relação aos commits vizinhos) — não necessariamente um diff vazio, porque commits posteriores podem ainda modificar as mesmas linhas.
  • Reverter um revert reaplicará a alteração original, pois o inverso do inverso é o original.

Quando usar git revert

Utilize git revert quando:

  • O commit que você quer desfazer já foi publicado (enviado via push, aberto em um pull request ou baixado por colegas de equipe).
  • Você quer desfazer um único commit específico em algum ponto no meio do histórico sem tocar nos commits que vieram depois dele.
  • Você precisa de um registro auditável de que uma alteração foi deliberadamente revertida.

Prefira git reset quando o commit for local e não publicado e você simplesmente quiser removê-lo, ou git commit --amend quando precisar apenas corrigir o commit mais recente (ainda não enviado).

Opções

-e --editAbre o editor de sistema configurado e solicita que você edite a mensagem do commit antes de confirmar o revert. Opção padrão.
--no-editFaz com que o revert não abra o editor (o oposto da opção -e).
-n --no-commitAdiciona as modificações inversas ao Índice de Staging e ao Diretório de Trabalho em vez de criar um novo commit.
-m <parent-number>Para reverter commits de merge, especifica o commit pai contra o qual reverter.

Exemplos

# Stage the reverted changes without committing them (useful for review)
git revert -n HEAD

# Revert a merge commit against its first parent
git revert -m 1 <merge-commit-hash>

Como funciona

Assim como git checkout e git reset, o git revert também recebe um commit especificado, mas não move os ponteiros de referência para esse commit. A operação de revert pega o commit especificado, inverte as modificações desse commit e cria um novo commit de revert.

Aqui está um exemplo de criação de um repositório:

Comando git revert

mkdir git_revert_example
cd git_revert_example/
git init .
#Initialized empty Git repository in /git_revert_example/.git/
touch w3docs_file
git add w3docs_file
git commit -m "original commit"
#[master (root-commit) 299b15f] original commit
#1 file changed, 0 insertions(+), 0 deletions(-)
#create mode 100644 w3docs_file
echo "original content" >> w3docs_file
git commit -m "add new content to w3docs_file"
#[master 3602d88] add new content to w3docs_file
#1 file changed, 1 insertion(+)
echo "prepended line content" >> w3docs_file
git commit -m "prepend content to w3docs file"
#[master 86bb32e] prepend content to w3docs file
#1 file changed, 1 insertion(+)
git log --oneline
#86bb32e prepend content to w3docs file
#3602d88 add new content to w3docs file
#299b15f original commit

Neste exemplo, um repositório é inicializado em um novo diretório chamado git_revert_example. Há 3 commits no repositório em que um arquivo chamado w3docs_file é adicionado. Seu conteúdo foi alterado duas vezes. Usamos git log ao final da configuração do repositório para mostrar todos os 3 commits no histórico de commits. Agora podemos invocar git revert:

git revert

git revert HEAD
#[master b9cd081] Revert "prepend content to w3docs file"
#1 file changed, 1 deletion(-)

O git revert não funcionará sem passar uma referência de commit. No exemplo acima, passamos a referência HEAD para reverter o último commit. Um revert cria um novo commit e abre o editor de sistema configurado para que você possa editar sua mensagem (passe --no-edit para aceitar o padrão). Podemos usar git log e ver o novo commit adicionado ao topo do histórico anterior:

git log --oneline

git log --oneline
#b9cd081 Revert "prepend content to w3docs file"
#86bb32e prepend content to w3docs file
#3602d88 add new content to w3docs_file
#299b15f original commit

Após o revert, o commit "prepend" (86bb32e) ainda está no histórico do projeto. O git revert adicionou um novo commit (b9cd081) que desfaz suas alterações em vez de excluí-lo. Essa é a principal diferença em relação ao git reset.

Revertendo sem confirmar

Passe -n (--no-commit) quando quiser desfazer vários commits em um único revert combinado, ou inspecionar as alterações inversas antes de registrá-las. O Git organiza as modificações inversas, mas não cria o commit, deixando você no controle:

# Stage the inverse of the last two commits, then commit once
git revert -n HEAD~1 HEAD
git status        # review the staged changes
git commit -m "Roll back the last two changes"

Quando você lista mais de um commit (ou um intervalo), o Git aplica um revert para cada um. Sem -n, ele criaria um commit por revert; com -n, todos são combinados em um único commit que você cria por conta própria.

Revertendo um commit de merge

Um commit de merge tem dois pais, portanto o Git não consegue determinar sozinho qual lado você quer manter. Você deve indicar qual pai representa a "linha principal" para reverter usando -m <parent-number>. Os números de pai começam em 1:

# Undo a merge, keeping the first parent (usually the branch you merged into)
git revert -m 1 <merge-commit-hash>

Em um cenário típico de "merge de uma branch de feature na main", o pai 1 é main e o pai 2 é a branch de feature, portanto -m 1 descarta as alterações da branch de feature.

Aviso

Reverter um merge registra que os commits mesclados foram desfeitos. Se você tentar mesclar essa branch novamente mais tarde, o Git verá esses commits como já mesclados e os ignorará. Para reintroduzir o trabalho, geralmente é necessário reverter o revert primeiro. Prefira reverter commits individuais em vez de reverter um merge quando possível.

Resolvendo um conflito de revert

Se commits posteriores modificaram as mesmas linhas que o revert está tentando desfazer, o Git para com um conflito — assim como um conflito de merge. Edite os arquivos marcados, faça o stage deles e conclua o revert em andamento:

git revert HEAD~2
# CONFLICT (content): Merge conflict in w3docs_file
# error: could not revert 4f2a1c0... change w3docs_file
# resolve the conflict markers in the file, then:
git add w3docs_file
git revert --continue   # records the revert commit

# Or, to back out of the whole operation:
git revert --abort

Reset vs. revert

O comando git revert desfaz um commit adicionando um novo commit, enquanto o git reset reescreve o histórico movendo o ponteiro da branch para trás e descartando os commits seguintes.

git revert

git revert1

Reverter é a escolha segura para commits que já foram publicados em um repositório compartilhado, e permite que você direcione um commit específico em qualquer ponto do histórico. Evite git revert em commits privados e não publicados, onde o git reset é mais simples e limpo.

Comandos relacionados

  • git reset — move o ponteiro da branch e descarta commits posteriores (desfazimento com reescrita do histórico).
  • git commit --amend — corrige o commit mais recente ainda não enviado.
  • git checkout — descarta alterações não confirmadas na árvore de trabalho.
  • git cherry-pick — a operação oposta: aplica as alterações de um commit na branch atual.

Prática

Prática
Quais são as características e opções do comando 'git revert'?
Quais são as características e opções do comando 'git revert'?
Was this page helpful?