O comando git revert pode ser considerado um comando do tipo "desfazer"; no entanto, ele não é uma operação tradicional de desfazer. Em vez de remover o commit do histórico do projeto, ele descobre como desfazer as alterações introduzidas pelo commit e anexa um commit novo com o conteúdo resultante. Isto evita que o Git perca o histórico, o que é importante para a integridade do histórico de revisão e para uma colaboração confiável.

O processo de reversão deve ser usado quando você quer aplicar o inverso do commit do histórico do projeto. Isso pode ser útil, por exemplo, se você estiver acompanhando um bug e descobrir que ele foi introduzido por um único commit. Em vez de ir até ela por conta própria, corrigir e confirmar um novo snapshot, você pode usar o git revert para fazer tudo isso na hora.

Git revert – Tutoriais do Git da Atlassian

Como funciona

O comando git revert é usado para desfazer alterações ao histórico de commits do repositório. Outros comandos de "desfazer", como o git checkout e o git reset, movem os indicadores de referência do HEAD e do branch para commits especificados. O git revert também pega o commit específico; no entanto, o git revert não move os indicadores de referência para esse commit. A operação de reversão vai pegar o commit especificado, inverter as alterações dele e criar um "commit de reversão" novo. Os indicadores de referência são então atualizados para apontar para o commit de reversão novo, tornando o commit na ponta do branch.

Para demonstrar, vamos criar um repositório de exemplo usando os exemplos da linha de comando abaixo:

$ mkdir git_revert_test
$ cd git_revert_test/
$ git init .
Initialized empty Git repository in /git_revert_test/.git/
$ touch demo_file
$ git add demo_file
$ git commit -am"initial commit"
[master (root-commit) 299b15f] initial commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 demo_file
$ echo "initial content" >> demo_file
$ git commit -am"add new content to demo file"
[master 3602d88] add new content to demo file
n 1 file changed, 1 insertion(+)
$ echo "prepended line content" >> demo_file
$ git commit -am"prepend content to demo file"
[master 86bb32e] prepend content to demo file
1 file changed, 1 insertion(+)
$ git log --oneline
86bb32e prepend content to demo file
3602d88 add new content to demo file
299b15f initial commit

Aqui, a gente inicializou um repositório em um diretório recém-criado chamado git_revert_test. A gente fez três commits no repositório em que foi adicionado um arquivo demo_file, bem como modificou o conteúdo duas vezes. No final do procedimento de configuração do repositório, a gente invocou git log para exibir o histórico de commits, exibindo um total de três commits. Com o repositório nesse estado, a gente já pode iniciar um git revert.

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

O git revert espera que uma referência de commit tenha passado e não vai ser executado sem uma. Aqui, a gente passou a referência HEAD. Isso vai reverter o último commit. Este é o mesmo comportamento se a gente tivesse revertido para o commit 3602d8815dbfa78cd37cd4d189552764b5e96c58. Semelhante a um merge, uma reversão vai criar um commit novo que vai abrir o editor do sistema configurado, exibindo uma mensagem de commit nova. Assim que uma mensagem de commit tiver sido digitada e salva, o Git vai continuar a operação. Agora, a gente pode examinar o estado do repositório usando git log e ver que há um commit novo adicionado ao registro anterior:

$ git log --oneline
1061e79 Revert "prepend content to demo file"
86bb32e prepend content to demo file
3602d88 add new content to demo file
299b15f initial commit

O terceiro commit ainda está no histórico do projeto após a reversão. Em vez de excluir, o git revert adicionou um commit novo que desfaz as modificações. Por isso, os segundo e quarto commits representam a mesma base de código, e o terceiro ainda está no histórico caso a gente queira voltar atrás.

Opções comuns

-e
--edit

Esta é uma opção padrão e não precisa ser especificada. Esta opção vai abrir o editor do sistema configurado e avisa quando se deve editar a mensagem de commit antes de confirmar a reversão.

--no-edit

Esta opção é o inverso da opção -e. A reversão não vai abrir o editor.

-n
--no-commit

Passar esta opção vai impedir que o git revert crie um commit novo que inverta o commit de destino. Em vez de criar o commit novo, esta opção vai adicionar as modificações inversas ao Índice de staging e Diretório de trabalho. Estes são outros usos do Git para gerenciar o status do repositório. Para obter mais informações, acesse a página git reset.

Redefinir x reverter

É importante entender que git revert desfaz apenas um commit—ele não "reverte" de volta ao estado anterior de um projeto removendo todos os commits realizados. No Git, isto é chamado de reset, não de revert.

Git revert vs Git reset – Tutoriais do Git da Atlassian

Reverter tem duas vantagens importantes em relação a redefinir. Em primeiro lugar, o processo de reversão não altera o histórico do projeto, fazendo dele uma operação "segura" para commits que já foram publicados no repositório compartilhado. Para saber mais sobre como alterar o histórico compartilhado é perigoso, acesse a página git reset.

Em segundo lugar, o git revert pode selecionar um commit individual em um ponto arbitrário do histórico, já o git reset só funciona retrocedendo a partir do commit atual. Por exemplo, se você quiser desfazer um commit antigo com o git reset, você vai ter que remover todos os commit que ocorreram após o commit de destino, remover e, então, reconfirmar todos os commits subsequentes. Nem é preciso dizer que não é uma solução muito elegante. Para uma discussão mais aprofundada sobre as diferenças entre o git revert e outros comandos de "desfazer", consulte Como redefinir, verificar e reverter.  

Resumo

O comando git revert é uma operação de desfazer avançada que oferece um método seguro de desfazer alterações. Em vez de excluir ou tornar commits órfãos no histórico de commits, uma reversão vai criar um commit novo que inverte as alterações especificadas. O git revert é uma alternativa mais segura que o git reset em relação à perda de trabalho. Para demonstrar os efeitos do git revert, foram abordados outros comandos que têm uma documentação mais aprofundada nas páginas individuais: git log, git commit e git reset.

Quer aprender a usar o git revert?

Tente este tutorial interativo.

Comece agora mesmo