Pular para o conteúdo principal

Tutorial de redefinição e reversão do Git para iniciantes

Descubra como usar a redefinição e a reversão do Git para gerenciar o histórico do seu projeto. Pratique com exemplos detalhados usando redefinições suaves, mistas e rígidas. Saiba a diferença entre redefinição e reversão do Git.
Actualizado 5 de nov. de 2024  · 10 min de leitura

No passado, o Git era considerado uma ferramenta personalizada para desenvolvedores de software devido à sua capacidade de permitir o controle de versão de códigos-fonte. Essa realidade está mudando porque a maioria dos cientistas de dados e engenheiros de aprendizado de máquina também está adotando essas práticas recomendadas.

Neste tutorial, forneceremos a você uma compreensão clara do Git. Em seguida, apresentaremos um tutorial prático de reversão e redefinição do Git, desde a inicialização de um projeto até o monitoramento das alterações.

Redefinição e reversão do Git

O que é o Git?

O Git é uma ferramenta de controle de versão de código aberto criada em 2005 por Linus Torvalds. Ele é usado principalmente para rastrear com eficiência as alterações nos arquivos do projeto, de modo que os membros do projeto possam ter um registro de todas as alterações e mesclá-las sem perder informações valiosas. Nosso curso introdutório ao Git dará a você mais informações sobre como e por que usar o Git, além de abordar as etapas mais comuns do fluxo de trabalho do Git.

Além disso, o curso Github Concepts fornecerá a você as chaves para usar os vários recursos do Github, navegar pela interface e executar com êxito as tarefas colaborativas diárias.

Torne-se um engenheiro de dados

Desenvolva habilidades em Python para se tornar um engenheiro de dados profissional.
Comece a Usar Gratuitamente

Visão geral do Git Revert e Reset 

O Git revert e o Git reset são dois comandos usados no Git para desfazer alterações no código e no histórico de um projeto, mas de maneiras diferentes. Nesta seção, forneceremos uma visão geral de como usar a reversão e a redefinição. Antes de mergulhar no processo, vamos criar um projeto Git.

Criar um projeto Git

Abaixo estão as instruções para que você crie um projeto git e o inicialize com alguns arquivos:

mkdir git_revert_reset
cd git_revert_reset
git init .
  • mkdir git_revert_reset cria uma pasta chamada git_revert_reset

  • cd git_revert_reset você vai para a pasta. 

  • git init . inicializa a pasta como um repositório git.

Considerando isso como um projeto de ciência de dados, podemos criar os seguintes arquivos para aquisição de dados, pré-processamento de dados e treinamento de modelos usando este comando touch:

touch data_acquisition.py data_preprocessing.py model_training.py

Esse é o conteúdo final da pasta do projeto.

git_revert_reset
      |---------- data_acquisition.py
      |---------- data_preprocessing.py
      |---------- model_training.py

Redefinição do Git 

Diagrama de antes e depois da redefinição do Git

Diagrama de redefinição do Git(Fonte)

O comando git reset é usado para desfazer as alterações em seu diretório de trabalho e voltar a um commit específico, descartando todos os commits feitos depois desse. 

Por exemplo, imagine que você fez dez commits. Usar git reset no primeiro commit removerá todos os nove commits, levando você de volta ao estágio do primeiro commit.

Antes de usar o git reset, é importante considerar o tipo de alteração que você pretende fazer; caso contrário, você criará mais caos do que benefícios. 

Você pode usar várias opções junto com git reset, mas estas são as principais. Cada um deles é usado de acordo com uma situação específica: git reset --soft, git reset --mixed, e git reset --hard

git reset --soft

O objetivo do --soft é alterar a referência HEAD (onde está o último commit em seu computador local) para um commit específico. Por exemplo, se você perceber que se esqueceu de adicionar um arquivo ao commit, poderá voltar atrás usando o --soft em relação ao seguinte formato:

  • git reset --soft HEAD~n para voltar ao commit com uma referência específica (n). git reset --soft HEAD~1 volta ao último commit.

  • git reset --soft volta para a cabeça com o .

Vamos dar uma olhada em alguns exemplos.

git add data_acquisition.py data_preprocessing.py

git add data

git commit -m "added data acquisition and preprocessing scripts"

Esse é o resultado do comando anterior. 

[master (root-commit) faf864e] added python scripts and data folder
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 data_acquisition.py
create mode 100644 data_preprocessing.py

Você pode verificar o status do commit da seguinte forma:

git status

On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
model_training.py

nothing added to commit but untracked files present (use "git add" to track)

Porém, esquecemos de adicionar o script model_training.py ao commit.

Como o último commit está localizado em HEAD, podemos corrigir esse problema executando as três instruções a seguir. 

  • Volte para a fase de pré-compromisso usando git reset --soft HEAD, permitindo que o arquivo git reset.

  • Adicione o arquivo esquecido com git add

  • Faça as alterações com um commit final git commit.

git reset --soft HEAD

git add model_training.py

git commit -m "added all the python scripts"

O resultado a seguir fez com que o git reset se tornasse mestre após todas as etapas anteriores: 

[master (root-commit) faf864e] added all the python scripts
3 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 data_acquisition.py
create mode 100644 data_preprocessing.py
create mode 100644 model_training.py

git reset --mixed

Esse é o argumento padrão para git reset. A execução desse comando tem dois impactos: (1) desfazer o commit de todas as alterações e (2) remover o palco. Imagine que adicionamos acidentalmente o arquivo model_training.py e queremos removê-lo porque o treinamento do modelo ainda não foi concluído. Veja a seguir como você deve proceder: 

  • Remova os arquivos que estavam no commit com git reset HEAD
  • Adicione apenas os arquivos necessários para o commit
git reset HEAD

git status

On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
model_training.py
data_acquisition.py
data_preprocessing.py

nothing added to commit but untracked files present (use "git add" to track)

Agora, podemos adicionar apenas os dois últimos arquivos a serem confirmados e fazer a confirmação.

git add data_acquisition.py data_preprocessing.py

git commit -m "Removed the model_training.py from the commit"

git reset --hard

Essa opção pode ser perigosa. Portanto, tenha cuidado ao usá-lo! 

Basicamente, ao usar o hard reset em um commit específico, você força o HEAD a voltar para esse commit e exclui todo o resto depois disso.

Antes de executar a reinicialização a frio, vamos dar uma olhada no conteúdo da pasta.

ls
data_acquisition.py data_preprocessing.py model_training.py

git reset --hard
HEAD is now at 97159bc added data acquisition and preprocessing scripts

Agora, vamos verificar o conteúdo da pasta:

ls
data_acquisition.py data_preprocessing.py

Observamos que o arquivo não rastreado model_training.py foi excluído. Novamente, certifique-se de entender o que você está fazendo com a declaração de redefinição, pois as consequências podem ser dramáticas!

Reversão do Git

Diagrama de reversão - antes e depois

Antes e depois da reversão(fonte)

Git revert é semelhante ao git reset, mas a abordagem é ligeiramente diferente. Em vez de remover todos os commits em seu caminho, a reversão APENAS desfaz um único commit, levando você de volta aos arquivos preparados antes do commit.

Portanto, em vez de remover um commit, o git revert inverte as alterações introduzidas pelo commit original, criando um novo commit com o conteúdo inverso subjacente. Essa é uma maneira segura de revogar um commit, pois evita que você perca seu histórico. 

É importante que você saiba que a reversão não terá efeito, a menos que o hash ou a referência do commit seja especificado. 

Vamos explorar algumas opções comuns de reversão do git.

git revert --no-edit <commit ID>

A opção --no-edit permite que o usuário não altere a mensagem usada para o commit que você deseja reverter, e isso fará com que o git reverta o arquivo para o ramo mestre.

Para ilustrar esse cenário, vamos criar dois novos arquivos a serem adicionados. 

touch model_monitoring.py data_monitoring.py

Depois de criar esses arquivos, precisamos adicioná-los à área de preparação da versão modificada.

git add model_monitoring.py

Antes de prosseguir, vamos dar uma olhada no status executando o seguinte comando.

git status
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file:   data_monitoring.py
new file:   model_monitoring.py


Podemos observar que os dois arquivos foram adicionados. Agora, podemos confirmar as alterações.

git commit -m "Added the monitoring script files"
[master (root-commit) eae84e7] Added the monitoring script files
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 data_monitoring.py
create mode 100644 model_monitoring.py


Em seguida, o hash de confirmação pode ser gerado por meio do seguinte comando. Isso é útil quando você tenta executar uma ação para esse commit específico. 

git reflog
eae84e7 (HEAD -> master) HEAD@{0}: commit (initial): Added the monitoring script files

Agora, vamos imaginar que o commit anterior não foi intencional e queremos nos livrar dele.

git revert --no-edit eae84e7

[master c61ef6b] Revert "Added the monitoring script files"
Date: Sat Nov 12 20:14:17 2022 -0600
2 files changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 data_monitoring.py
delete mode 100644 model_monitoring.py

Vamos dar uma olhada no registro dos commits:

git log

commit c61ef6b4e86f41f47c8c77de3b5fca3945a7c075 (HEAD -> master)
Author: Zoumana Keita <keitnekozou@gmail.com>
Date:   Sat Nov 12 20:14:17 2022 -0600

  Revert "Added the monitoring script files"
 
  This reverts commit eae84e7669af733ee6c1b854f2fcd9acfea9d4a3.

commit eae84e7669af733ee6c1b854f2fcd9acfea9d4a3
Author: Zoumana Keita <keitnekozou@gmail.com>
Date:   Sat Nov 12 20:05:57 2022 -0600

  Added the monitoring script files

No registro, podemos observar que um novo commit foi criado com o ID c61ef6b4e86f41f47c8c77de3b5fca3945a7c075 para reverter o commit original com o ID eae84e7669af733ee6c1b854f2fcd9acfea9d4a3

Neste exemplo, como temos um único commit, poderíamos simplesmente usar git revert HEAD,, que teria o mesmo efeito ao reverter o último commit.

git revert <hash de confirmação>

Isso removerá apenas as alterações associadas a esse hash de commit e não afetará nenhum outro commit.

Qual reversão do git você acha que terá efeito, considerando o ID gerado anteriormente? 

Se sua resposta foi c61ef6b4e86f41f47c8c77de3b5fca3945a7c075, então você está certo. Considerar eae84e7669af733ee6c1b854f2fcd9acfea9d4a3 não terá efeito, pois ele é substituído por um novo. 

Vamos ver o que acontece quando você tenta realizar a reversão.

git revert c61ef6b4e86f41f47c8c77de3b5fca3945a7c075

[master aaead40] Revert "Revert "Added the monitoring script files""

 2 files changed, 0 insertions(+), 0 deletions(-)

 create mode 100644 data_monitoring.py

 create mode 100644 model_monitoring.py

Como você pode ver, os dois arquivos inicialmente criados e confirmados foram trazidos de volta!

git revert --no-commit <identificação do commit>

O objetivo de usar a opção --no-commit ou -n é evitar que o git faça o commit automático da reversão. Isso pode ser útil se você quiser revisar as alterações feitas pelo comando revert antes de confirmá-las.

Vamos considerar o seguinte exemplo: 

git revert --no-commit c61ef6b4e86f41f47c8c77de3b5fca3945a7c075

Isso reverterá as alterações feitas pelo commit com o ID c61ef6b4e86f41f47c8c77de3b5fca3945a7c075, mas não criará automaticamente um novo commit para registrar a reversão. Em vez disso, ele deixará as alterações sem ser processadas para que você possa analisá-las e decidir se deve confirmar a reversão manualmente.

Git Revert vs. Git Revert. Redefinir

Reversão do Git 

  • Usando o git revert, você pode voltar a estados anteriores enquanto cria um novo commit.

  • Escolha essa opção se você quiser desfazer as alterações em uma ramificação pública por segurança.

Redefinição do Git

  • Com git reset, você pode voltar aos commits anteriores, mas não pode criar um novo commit. 

  • Essa opção é melhor para desfazer alterações em uma ramificação privada.

Conclusão

Neste tutorial, vimos como realizar alterações em git reset e git revert em seu repositório git. Lembre-se de que uma reinicialização total pode ser muito perigosa porque fará com que você perca os arquivos não rastreados no projeto. 

Então, o que vem a seguir? A DataCano tem vários tutoriais que podem ser uma boa próxima etapa para que você aprimore suas habilidades com o Git, como, por exemplo, o tutorial "Como você pode fazer isso?

Obtenha a certificação para a função de engenheiro de dados dos seus sonhos

Nossos programas de certificação ajudam você a se destacar e a provar que suas habilidades estão prontas para o trabalho para possíveis empregadores.

Obtenha Sua Certificação
Timeline mobile.png

Perguntas frequentes sobre redefinição e reversão do Git

Qual é a diferença entre o git reset e o git revert?

git reset é usado para desfazer commits no repositório local, movendo o ponteiro do branch para um commit anterior, descartando efetivamente todos os commits feitos após esse ponto. git revertPor outro lado, o comando , é usado para desfazer alterações que foram confirmadas no repositório, criando um novo commit que desfaz as alterações feitas pelo commit específico.

Você deve usar o git reset hard?

Tenha cuidado ao usar o git reset hard, pois ele pode destruir completamente todas as alterações e removê-las do diretório local. Antes de usá-lo, tenha 100% de certeza do que você está fazendo.

Quando devo usar o git reset?

O git reset é útil quando você deseja desfazer commits que não foram enviados para um repositório remoto. Ele pode ser usado para remover commits que contenham erros ou que não sejam mais necessários.

É importante observar que o git reset é uma operação local e não afeta o repositório remoto. Se você já tiver enviado os commits que deseja desfazer, deverá usar o git revert.

Quando devo usar o git revert?

O git revert é útil quando você deseja desfazer commits que já foram enviados para um repositório remoto. É uma opção segura porque não destrói nenhum commit e deixa um registro claro das alterações feitas no repositório.

É importante observar que o git revert só pode desfazer commits que não tenham sido mesclados em outras ramificações. Se quiser desfazer os commits que fazem parte de um ramo mesclado, você deve usar o git reset ou outro método para remover os commits.

O que é git reset?

git reset é usado para desfazer alterações no histórico de commits ou no diretório de trabalho. Ele permite que você redefina o HEAD para um commit específico e, opcionalmente, modifique o índice (área de preparação) e o diretório de trabalho. 

Quais são as diferenças entre --soft, --mixed e --hard no git reset?

--soft: Move HEAD para o commit especificado, mas mantém as alterações preparadas para o commit. --mixed (padrão): Move HEAD para o commit especificado e remove as alterações (mantém o diretório de trabalho intacto). --hard: Move HEAD para o commit especificado e descarta todas as alterações no índice e no diretório de trabalho.

Temas
Relacionado
Git

blog

O que é Git? Manual completo do Git

Saiba mais sobre o sistema de controle de versão mais conhecido e por que é uma ferramenta de colaboração indispensável para cientistas de dados e programadores.
Summer Worsley's photo

Summer Worsley

14 min

tutorial

Tutorial do GitHub e do Git para iniciantes

Um tutorial para iniciantes que demonstra como funciona o controle de versão do Git e por que ele é crucial para projetos de ciência de dados.
Abid Ali Awan's photo

Abid Ali Awan

17 min

tutorial

Git Rename Branch: Como renomear uma filial local ou remota

Saiba como renomear ramificações locais e remotas do Git usando o terminal ou a interface gráfica do usuário (GUI) de clientes populares como o GitHub.
François Aubry's photo

François Aubry

tutorial

Tutorial de push e pull do GIT

Saiba como realizar solicitações Git PUSH e PULL por meio do GitHub Desktop e da linha de comando.

Olivia Smith

13 min

tutorial

Git Pull Force: Como substituir uma ramificação local por uma remota

Saiba por que o git pull --force não é a melhor maneira de substituir uma ramificação local pela versão remota e descubra o método adequado usando git fetch e git reset.
François Aubry's photo

François Aubry

tutorial

Git Prune: O que é o Git Pruning e como usar o Git Prune

O Git prune é um comando do Git que remove objetos do repositório que não são mais acessíveis a partir de qualquer commit ou branch, ajudando a liberar espaço em disco.
François Aubry's photo

François Aubry

5 min

See MoreSee More