Desfazendo alterações

Como desfazer commits e alterações

Nesta seção, vamos discutir as estratégias e comandos "desfazer" do Git disponíveis. Em primeiro lugar, é importante observar que o Git não tem um sistema tradicional de "desfazer", como aqueles encontrados em aplicativos de processamento de palavras. Vai ser vantajoso não mapear operações do Git para nenhum modelo mental tradicional de "desfazer". Além do mais, o Git tem sua própria nomenclatura para operações "desfazer", que é melhor aproveitar em uma discussão. Esta nomenclatura inclui termos como redefinir, reverter, verificar, limpar, etc.

Uma metáfora engraçada é pensar no Git como um utilitário de gerenciamento de cronograma. Os commits são capturas instantâneas de um ponto no tempo ou pontos de interesse ao longo do cronograma do histórico de um projeto. Além desse recurso, vários cronogramas podem ser gerenciados por meio do uso de ramificações. Ao "desfazer" no Git, você, em geral, está voltando no tempo ou para outro cronograma em que os erros não aconteceram.

Este tutorial oferece todas as habilidades necessárias para trabalhar com revisões anteriores de um projeto de software. Primeiro, ele mostra como explorar commits antigos e, em seguida, explica a diferença entre a reversão de commits públicos no histórico do projeto vs. a redefinição de alterações não publicadas em sua máquina local.

Como encontrar o que está perdido: como revisar confirmações antigas

git log --oneline
e2f9a78fe Replaced FlyControls with OrbitControls
d35ce0178 Editor: Shortcuts panel Safari support.
9dbe8d0cf Editor: Sidebar.Controls to Sidebar.Settings.Shortcuts. Clean up.
05c5288fc Merge pull request #12612 from TyLindberg/editor-controls-panel
0d8b6e74b Merge pull request #12805 from harto/patch-1
23b20c22e Merge pull request #12801 from gam0022/improve-raymarching-example-v2
fe78029f1 Fix typo in documentation
7ce43c448 Merge pull request #12794 from WestLangley/dev-x
17452bb93 Merge pull request #12778 from OndrejSpanel/unitTestFixes
b5c1b5c70 Merge pull request #12799 from dhritzkiv/patch-21
1b48ff4d2 Updated builds.
88adbcdf6 WebVRManager: Clean up.
2720fbb08 Merge pull request #12803 from dmarcos/parentPoseObject
9ed629301 Check parent of poseObject instead of camera
219f3eb13 Update GLTFLoader.js
15f13bb3c Update GLTFLoader.js
6d9c22a3b Update uniforms only when onWindowResize
881b25b58 Update ProjectionMatrix on change aspect
Tutorial do Git: Como verificar uma confirmação anterior

Como visualizar uma revisão antiga

Este exemplo supõe que você começou a desenvolver um experimento maluco, mas você não tem certeza se quer mantê-lo ou não. Para ajudá-lo a decidir, você quer dar uma olhada no estado do projeto antes de começar o experimento. Primeiro, é necessário encontrar o ID da revisão que você quer ver.

git log --oneline

Digamos que o histórico do seu projeto seja parecido com o seguinte:

b7119f2 Continue doing crazy things
872fa7e Try something crazy
a1e8fb5 Make some important changes to hello.txt
435b61d Create hello.txt
9773e52 Initial import

Você pode usar git checkout para ver o commit “Make some import changes to hello.txt” da seguinte forma:

git checkout a1e8fb5

This makes your working directory match the exact state of the a1e8fb5 commit. You can look at files, compile the project, run tests, and even edit files without worrying about losing the current state of the project. Nothing you do in here will be saved in your repository. To continue developing, you need to get back to the “current” state of your project:

git checkout main

Como desfazer uma captura instantânea confirmada

Existem, tecnicamente, várias estratégias diferentes para "desfazer" um commit. Os exemplos a seguir pressupõem que temos um histórico de commit que se parece assim:

git log --oneline
872fa7e Try something crazy
a1e8fb5 Make some important changes to hello.txt
435b61d Create hello.txt
9773e52 Initial import

We will focus on undoing the 872fa7e Try something crazy commit. Maybe things got a little too crazy.

Como desfazer uma confirmação com git checkout

Como desfazer uma confirmação pública com git revert

Vamos supor que estejamos de volta ao nosso exemplo de histórico de commit original. O histórico que inclui o commit 872fa7e. Desta vez, vamos tentar reverter um "desfazer". Se executarmos git revert HEAD, o Git criará um novo commit com o inverso do último commit. Isso adiciona um novo commit ao histórico de ramificação atual e agora o faz parecer assim:

git log --oneline
e2f9a78 Revert "Try something crazy"
872fa7e Try something crazy
a1e8fb5 Make some important changes to hello.txt
435b61d Create hello.txt
9773e52 Initial import

At this point, we have again technically 'undone' the 872fa7e commit. Although 872fa7e still exists in the history, the new e2f9a78 commit is an inverse of the changes in 872fa7e. Unlike our previous checkout strategy, we can continue using the same branch. This solution is a satisfactory undo. This is the ideal 'undo' method for working with public shared repositories. If you have requirements of keeping a curated and minimal Git history this strategy may not be satisfactory.

Como desfazer uma confirmação com git reset

git log --oneline
a1e8fb5 Make some important changes to hello.txt
435b61d Create hello.txt
9773e52 Initial import

The log output shows the e2f9a78 and 872fa7e commits no longer exist in the commit history. At this point, we can continue working and creating new commits as if the 'crazy' commits never happened. This method of undoing changes has the cleanest effect on history. Doing a reset is great for local changes however it adds complications when working with a shared remote repository. If we have a shared remote repository that has the 872fa7e commit pushed to it, and we try to git push a branch where we have reset the history, Git will catch this and throw an error. Git will assume that the branch being pushed is not up to date because of it's missing commits. In these scenarios, git revert should be the preferred undo method.

Como desfazer a última confirmação

Como desfazer alterações não confirmadas

O diretório de trabalho

O índice de staging

Como desfazer alterações públicas

Ao trabalhar em uma equipe com repositórios remotos, devem ser feitas considerações extras ao desfazer alterações. Git reset deve ser considerado em geral como um método desfazer "local". Uma redefinição deve ser usada ao desfazer alterações para uma ramificação privada. É uma maneira segura de isolar a remoção de commits de outras ramificações que podem estar em uso por outros desenvolvedores. Surgem problemas quando uma redefinição é executada em uma ramificação compartilhada e essa ramificação é, então, enviada em contexto remoto com git push. O Git vai bloquear o envio neste cenário alegando que a ramificação que está sendo enviada está desatualizada em relação à ramificação remota uma vez que há commits ausentes.

O melhor método para desfazer um histórico compartilhado é o git revert. Um revert é mais seguro que um reset, pois não remove commits de um histórico compartilhado. Um revert manterá commits que você deseja desfazer e criará um novo commit que inverte o commit indesejado. Este método é mais seguro para colaboração remota compartilhada, pois um desenvolvedor remoto pode, então, fazer o pull da ramificação e receber o novo commit revert que desfaz o commit indesejado.

Resumo