Close

git revert

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 inverter as alterações introduzidas pelo commit e anexa um commit novo com o conteúdo resultante. Assim, ele 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.


Como funciona


O comando git revert é usado para desfazer alterações ao histórico de commits do repositório. Outros comandos de "desfazer", como git checkout e git reset, movem os indicadores de referência do HEAD e da ramificação para um commit especificado. 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, colocando o commit na 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"
[main (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"
[main 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"
[main 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
Logotipo do Git
Material relacionado

Folha de consulta do Git

Logotipo do Bitbucket
VER SOLUÇÃO

Aprenda a usar o Git com o Bitbucket Cloud

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
[main 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 avisar 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

Pular 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 da árvore do Git para gerenciar o estado do repositório. Para saber 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.

Redefinição versus reversão do diagrama

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.


Compartilhar este artigo
Próximo tópico

Leitura recomendada

Marque esses recursos para aprender sobre os tipos de equipes de DevOps ou para obter atualizações contínuas sobre DevOps na Atlassian.

Pessoas colaborando usando uma parede cheia de ferramentas

Blog do Bitbucket

Ilustração do DevOps

Caminho de aprendizagem de DevOps

Demonstrações de funções no Demo Den com parceiros da Atlassian

Como o Bitbucket Cloud funciona com o Atlassian Open DevOps

Inscreva-se para receber a newsletter de DevOps

Thank you for signing up