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
Material relacionado
Folha de consulta do Git
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.
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.