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 a confirmação do histórico do projeto, ele descobre como inverter as alterações introduzidas pela confirmação e anexa uma nova confirmação com o conteúdo inverso resultante. Isso evita que o Git perca o histórico, o que é importante para a integridade do histórico de revisões e para colaboração confiável.

O processo de reversão deve ser usado quando você quiser aplicar o inverso da confirmação do histórico do projeto. Isso pode ser útil, por exemplo, se você estiver rastreando um bug e descobrir que ele foi introduzido por uma única confirmação. Em vez de em modo manual ir até ela, corrigir e confirmar um novo snapshot, você pode usar o git revert para fazer tudo isso do jeito instantâneo.

Git revert – Tutoriais do Git da Atlassian

Como funciona

O comando git revert é usado para desfazer alterações ao histórico de confirmações do repositório. Outros comandos de "desfazer", como o git checkout e o git reset, movem os indicadores de referência do HEAD e da ramificação para confirmações especificadas. O git revert também pega a confirmação especifica; no entanto, o git revert não move os indicadores de referência para esta confirmação. A operação de reversão vai pegar a confirmação especificada, inverter as alterações desta confirmação e criar uma nova "confirmação de reversão". Os indicadores de referência são então atualizados para apontar para a nova confirmação de reversão, tornando a confirmação ponta da ramificação.

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, iniciamos um repositório no diretório há pouco tempo criado chamado git_revert_test. A gente fez 3 confirmações ao repositório no qual foi adicionado um arquivo demo_file e o conteúdo modificado duas vezes. No final do procedimento de configuração do repositório, o git log foi invocado para exibir o histórico de confirmações, exibindo um total de 3 confirmações. Com o repositório neste estado, está tudo certo para 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 a referência de confirmação tenha sido passada e nãovai serexecutado sem uma. Aqui, a gente passa a referência do HEAD. Isso vai reverter a confirmação mais recente. Este é o mesmo comportamento que reverter para a confirmação 3602d8815dbfa78cd37cd4d189552764b5e96c58. Assim como em uma mesclagem, a reversão vai criar uma nova confirmação, que vai abrir o editor do sistema configurado solicitando a nova mensagem de confirmação. Após a mensagem de confirmação ter sido inserida e salva, o Git vai retomar a operação. Agora é possível examinar o estado do repositório usando o git log e ver que há uma nova confirmação adicionada 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

Observe que a terceira confirmação ainda está no histórico do projeto após a reversão. Em vez de fazer a exclusão, o git revert adicionou a nova confirmação para desfazer as alterações. Como resultado, a segunda e a quarta confirmação representam com exatidão a mesma base de código e a terceira ainda está em histórico, apenas para o caso de haver necessidade de voltar a ela no futuro.

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 solicitar que você edite a mensagem de confirmação antes de confirmar a reversão.

--no-edit

Este é 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 uma nova confirmação que inverta a confirmação alvo. Em vez de criar a nova confirmação, esta opção vai adicionar as alterações inversas ao índice de staging e ao diretório de trabalho. Estes são os outros três usos do Git para gerenciar o estado do repositório. Para mais informações, visite a página git reset.

Redefinir x reverter

É importante entender que o git revert desfaz apenas a confirmação—ele não "reverte" de volta ao estado anterior do projeto removendo todas as confirmações realizadas. No Git, isto é chamado de redefinição (reset), não de reversão (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 confirmações que já foram publicadas 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 uma confirmação individual no ponto arbitrário do histórico, ao passo que o git reset só funciona retrocedendo a partir da confirmação atual. Por exemplo, se você quiser desfazer uma confirmação antiga com o git reset, você vai ter que remover todas as confirmações que ocorreram após a confirmação alvo, remover e, então, reconfirmar todas as confirmações subsequentes. Nem é preciso dizer que esta 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 Redefinir, verificar e reverter.  

Resumo

O comando git revert é uma operação de desfazer de avanço, que oferece um método seguro de desfazer alterações. Em vez de excluir ou tornar órfãs confirmações no histórico de confirmações, uma reversão vai criar uma nova confirmação que inverte as alterações especificadas. O git revert é uma alternativa mais segura que o git reset em relação a perder 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.

Pronto(a) para aprender o git revert?

Tente este tutorial interativo.

Comece agora mesmo