Curso
Se você já trabalhou em um projeto de codificação em grupo, sabe como as coisas podem desandar rapidamente quando você tenta desfazer uma alteração. Um movimento errado e você pode acabar com seu próprio trabalho ou, pior ainda, quebrar algo que seu colega de equipe acabou de empurrar.
Por isso, é muito importante que você entenda o que o Git oferece para desfazer erros e quando usar cada opção. Alguns comandos são seguros para ambientes de equipe, enquanto outros são melhores para a limpeza local , onde você não tem problemas em reescrever o histórico.
Este guia orienta você sobre tudo isso. Você aprenderá as diferentes maneiras de desfazer confirmações, como elas funcionam e qual delas usar, dependendo da situação.
Entendendo o histórico de commits do Git
Você já pressionou "Ctrl+S" para salvar uma versão do documento e voltar a ela mais tarde? Isso é exatamente o que um commit do Git faz, mas para toda a sua base de código.
O que é um commit no Git?
Um commit do git é o instantâneo do seu projeto em um ponto específico no tempo. Ele congela o estado atual de todos os seus arquivos e atribui a essa versão um ID exclusivo, como se você estivesse tirando uma foto com registro de data e hora do seu código. Você sempre pode voltar a esse ponto se algo quebrar mais tarde.
Como isso funciona? Quando você modifica um arquivo em seu repositório, as alterações não são armazenadas imediatamente. Em vez disso, eles existem localmente no seu diretório de trabalho atual. Para salvá-las, essas alterações são preparadas e, em seguida, confirmadas no repositório. Seu histórico de commits é o registro de todos os commits realizados em um repositório.
Confirmações locais versus remotas
Os commits locais permanecem em seu computador e não ficam visíveis para seus colegas ou colaboradores até que você decida compartilhá-los. Isso significa que você tem mais controle sobre eles: você pode reescrever o histórico, alterar, excluir ou redefinir sem afetar mais ninguém.
Os commits remotos, por outro lado, são acessíveis a todos que trabalham no repositório. Isso significa que você não deve reescrever ou excluir esses commits. Se você fizer isso, os seus colegas de equipe terão problemas se estiverem usando o mesmo ramo remoto. Portanto, você deve ser cauteloso e estar ciente do que está fazendo antes de reescrever a história compartilhada.
Desfazendo o último commit do Git localmente
No Git, o HEAD aponta para o último commit no histórico do seu projeto. Quando você usa o comando git reset
, está dizendo ao Git para mover esse ponteiro para um commit diferente.
Vamos explicar como você pode usar o git reset
para desfazer o último commit em vários cenários.
Usando git reset --soft HEAD~1
Ele move o HEAD de volta para um commit, mas deixa suas alterações na área de preparação. Seus arquivos permanecem intactos e tudo o que você cometeu ainda está na fila da área do palco. Use isso quando você quiser desfazer o próprio commit, mas manter todas as alterações preparadas e preparadas.
Usando git reset --mixed HEAD~1
Este vai um passo além. Ele também move o HEAD de volta para um commit, mas limpa a área de preparação. Seus arquivos ainda estão no diretório de trabalho, mas não há mais nada preparado. Esse é o modo padrão de git reset
.
Usando git reset --head HEAD~1
Ele move o HEAD de volta, limpa a área de preparação e apaga as alterações no seu diretório de trabalho. É como se o último commit (e todas as alterações com ele) nunca tivesse existido.
Use-o com cuidado - uma vez que essas mudanças tenham desaparecido, é difícil trazê-las de volta. Portanto, só execute isso se você tiver certeza absoluta de que não precisa de nada do último commit.
Exemplo 1: Desfazer o último commit localmente (retrabalho seguro)
Digamos que você acabou de fazer um commit, mas percebeu que esqueceu de atualizar o arquivo README.
Cenário:
Você fez alterações em main.py
, mas esqueceu de atualizar README.md
. Você deseja alterar o último commit sem afetar mais ninguém, e ainda não fez nenhum push.
Solução:
Use git reset --soft HEAD~1
para desfazer o commit e manter as alterações preparadas:
git reset --soft HEAD~1
Agora, atualize o arquivo README, adicione-o ao estágio e recomece tudo:
git add README.md
git commit -m "Update main.py and README.md"
Por que isso funciona: Como o commit não foi enviado, você pode reescrever o histórico local sem afetar ninguém.
Desfazendo um commit do Git enviado
Então você fez uma confirmação... e agora se arrepende. Todos nós já passamos por isso. Mas como você pode desfazer isso sem prejudicar o trabalho dos membros da sua equipe?
Reescrevendo o histórico com git push --force
Normalmente, o Git só permite que você faça push se a ramificação local tiver sido recentemente extraída e estiver atualizada com a remota. Mas você pode substituir essa regra usando um comando superpotente como push --force
. Ele substitui todo o histórico remoto pelo que estiver em sua filial local.
É por isso que o --force
é poderoso, mas perigoso. Em uma configuração de equipe, ele pode excluir os commits de seus colegas se eles não tiverem sido transferidos para o seu branch local. Use-o somente quando souber exatamente o que está fazendo e, de preferência, quando você for o único a trabalhar nesse repositório.
Além do push --force
, há também o pull --force
, outro comando poderoso que deve ser usado com cuidado. Learn sobre isso aqui.
Alternativas mais seguras usando o git revert
Se você quiser desfazer um commit sem excluir o histórico, git revert
é a melhor opção. Ele não remove o commit; ele cria um novo commit que desfaz as alterações.
Digamos que você tenha feito o commit de um arquivo chamado streamlit_app.py
e queira se livrar dele. git revert
gerará um novo commit que excluirá apenas esse arquivo, deixando o restante do histórico intacto.
Por padrão, o git revert
tem como alvo o commit mais recente. No entanto, você também pode reverter commits mais antigos especificando o ID do commit.
Exemplo 2: Desfazer um commit enviado com segurança em um ramo compartilhado
Digamos que você tenha feito uma alteração de configuração incorreta e precise revertê-la sem excluir o histórico.
Cenário:
Você enviou um commit que adiciona uma linha incorreta em config.yaml
. Sua equipe já está trabalhando no mesmo ramo remoto (main
), portanto você não pode usar reset
ou force-push.
Solução:
Use git revert
para desfazer o commit com segurança:
git revert <commit-hash>
Isso abrirá um editor de texto para que você confirme a mensagem de reversão. Salve e feche o editor para criar um novo commit que desfaça o anterior.
Se o último commit for o que você deve reverter:
git revert HEAD
Em seguida, envie as alterações:
git push origin main
Por que isso funciona: git revert
não reescreve o histórico - ele adiciona um novo commit. Isso o torna seguro para filiais compartilhadas e fluxos de trabalho de equipe.
Visualização e confirmação de alterações
Às vezes, você só quer ver o que aconteceu até agora, como se estivesse rolando para versões anteriores para encontrar o commit que deseja desfazer. O Git oferece a você ferramentas para fazer exatamente isso.
Usando o log do git para verificar o histórico de commits
Execute git log
em seu terminal e você obterá uma lista completa de todos os commits em seu ramo atual. Você pode usar isso para identificar um commit específico para desfazer ou modificar.
Por exemplo: git log
a saída pode ter a seguinte aparência:
- e3a1b7f Corrigir erro de digitação no README
- 4f2c9a1 Adicionar validação de login
- 9d5b3e8 Confirmação inicial
Cada linha mostra um hash de confirmação e uma mensagem. Se você quiser desfazer uma alteração específica, basta copiar o hash do commit e usá-lo com git revert
.
Uso de ferramentas ou extensões de GUI
Se você não for um desenvolvedor ou nunca tiver trabalhado com controle de versão antes, todas essas instruções de linha de comando podem parecer uma língua estrangeira. É aí que entram as ferramentas de GUI. Eles tornam o Git visual e amigável para iniciantes, para que você possa se concentrar no que importa, sem precisar memorizar comandos.
GitHub Desktop
O GitHub Desktop é um aplicativo gratuito que oferece uma interface simples e fácil para você trabalhar com seus repositórios do GitHub. Depois de instalado, você pode usá-lo para criar ramificações, fazer confirmações, enviar para o controle remoto e gerenciar seu projeto, tudo com cliques em vez de comandos do Git.
Ele é perfeito se você for novo no Git ou se quiser apenas uma experiência mais suave no gerenciamento de alterações.
Interface de usuário do GitHub para desktop. Fonte da imagem.
Árvore de fontes
O Sourcetree é uma ferramenta GUI Git gratuita para Mac e Windows. Ele oferece a você uma maneira visual de gerenciar ramificações, commits e mesclagens sem tocar no terminal. Ele é leve, fácil de usar para iniciantes e funciona bem com plataformas populares como GitHub, GitLab e Bitbucket.
Como foi criado pela Atlassian, ele também funciona bem com outras ferramentas da Atlassian, como Jira, Confluence e Bamboo, o que o torna uma ótima opção se a sua equipe já usa esse ecossistema.
Interface de usuário do Sourcetree. Fonte da imagem.
GitKraken
O GitKraken é uma GUI do Git repleta de recursos que torna o trabalho com repositórios mais fácil e visual. Seu principal destaque é a visualização de gráficos - uma linha do tempo colorida e interativa do histórico do seu repositório que facilita o acompanhamento de ramificações, mesclas e commits.
À esquerda, você verá a árvore de arquivos do seu projeto. À direita, você obterá informações detalhadas sobre qualquer commit, arquivo ou ramificação em que clicar. É intuitivo, amigável para iniciantes e repleto de recursos avançados para usuários avançados também.
O GitKraken é gratuito para uso pessoal, mas se você estiver trabalhando em uma empresa ou gerenciando repositórios privados, precisará de um plano pago.
Você pode acessarser interface. Fonte da imagem.
Práticas recomendadas para desfazer commits do Git
Desfazer um commit não é algo a temer, desde que você siga as boas práticas. Vamos discutir o que eles são.
Use as ramificações para experimentação
Sempre que você estiver criando algo novo ou corrigindo um bug, crie uma ramificação separada da principal. Faça todo o seu trabalho lá, teste-o minuciosamente e só então faça o merge de volta ao ramo principal.
Dessa forma, todos os erros ou reversões são corrigidos com segurança na sua ramificação sem atrapalhar o trabalho do restante da equipe.
Em caso de dúvida, use o git revert
Digamos que você tenha feito alguns commits em uma ramificação local e acidentalmente os tenha enviado para a ramificação principal. Ops. Agora você quer desfazer um desses commits sem bagunçar o histórico compartilhado. É aí que o git revert
salva o dia.
Execute git revert HEAD~1
. Isso cria um novo commit que desfaz as alterações do penúltimo commit (porque HEAD~1 aponta para ele). Ele não exclui nada, mas reverte as alterações de forma limpa e rastreável.
Depois que você tiver feito isso, não se esqueça de enviar a correção para o controle remoto usando git push origin
.
Observação: Se as alterações já tiverem sido enviadas para um ramo compartilhado, use git revert
. Ele mantém o histórico de commits intacto e não atrapalha seus colegas de equipe.
Documentar suas alterações
Você não precisa abrir uma página do Confluence apenas para manter seu histórico de versões, pois o Git já faz isso por você. O truque é usá-lo de forma inteligente.
Comece com mensagens de compromisso claras e significativas. Se você estiver revertendo algo, certifique-se de que a mensagem explique por que você está desfazendo o procedimento.
E anote o ID do commit e um breve resumo do que foi alterado. Isso geralmente é suficiente para atender à finalidade da documentação.
Colaboração em equipes
Quando você usa comandos como git reset
, rebase
ou commit --amend
em um ramo que outros também estão usando, você está alterando o histórico de commits. Qualquer pessoa que tenha puxado a história antiga agora enfrentará conflitos.
Portanto, use os comandos de reescrita somente nas ramificações locais ou de recursos. Se você precisar forçar ou reescrever o histórico compartilhado, comunique isso à sua equipe o mais cedo possível.
Conclusão
O Git oferece a você diferentes maneiras de desfazer erros, mas saber quando e como usar cada ferramenta é o que separa os desenvolvedores confiantes dos confusos.
Exploramos como o git reset
funciona em diferentes modos, quando usar o git revert,
e por que é fundamental escolher a ferramenta certa de acordo com a situação em que você se encontra.
Em resumo:
- Evite reescrever o histórico depois de fazer push para ramificações compartilhadas
- Comunique-se com antecedência se você precisar forçar a barra
- Use
git revert
para desfazer com segurança os commits enviados
Para as próximas etapas, saiba comovocê pode reverter o commit de mesclagem aqui. Se você já aprendeu o básico e está pronto para se aprofundar, confira nosso curso intermediário de git!
Aprenda hoje os fundamentos do Git
Perguntas frequentes
O que o git reset --soft HEAD~1 realmente faz?
Ele move o ponteiro HEAD um commit para trás, mas deixa todas as alterações preparadas. É perfeito quando você deseja revisar o commit sem perder nenhum trabalho.
Quando devo usar git reset --mixed em vez de --soft?
Use --mixed
quando você quiser manter as alterações nos arquivos, mas removê-las da área de preparação. É útil para que você possa fazer edições antes de refazer o compromisso.
É perigoso usar o git push --force?
Sim, especialmente em um ambiente de equipe. Ele reescreve o histórico de commits no ramo remoto e pode apagar o trabalho dos colegas de equipe se não for usado com cuidado.
Qual é a diferença entre o git revert e o git reset?
git revert
adiciona um novo commit que desfaz as alterações sem mexer no histórico, enquanto o git reset
move o HEAD e pode alterar o histórico, o que é especialmente arriscado se você for enviado.
Posso desfazer um commit sem perder minhas alterações?
Sim, use git reset --soft
para manter as alterações preparadas ou --mixed
para mantê-las no diretório de trabalho.
Qual é a maneira mais segura de desfazer um commit em um repositório compartilhado?
Use git revert
. Ele preserva o histórico ao criar um novo commit que reverte as alterações, evitando conflitos com colegas de equipe.
Como faço para encontrar o commit que quero desfazer?
Use git log
para listar os commits anteriores. Copie o hash do commit para o qual você deseja reverter ou redefinir.
As ferramentas de GUI, como o GitHub Desktop, podem reverter commits?
Sim, as ferramentas de GUI oferecem maneiras fáceis de desfazer confirmações sem que você precise se lembrar da sintaxe da linha de comando. Eles são ideais para iniciantes.
O que acontece com o histórico de confirmações após uma reinicialização?
Com git reset
, o(s) commit(s) é(são) removido(s) do seu histórico, a menos que tenha(m) sido enviado(s). Então, o controle remoto ainda tem um registro, a menos que você force o pressionamento.
É possível alterar um commit após o envio?
Não, não sem coordenação. Alterar e depois forçar pode atrapalhar o trabalho compartilhado. Faça isso apenas em filiais isoladas ou em projetos solo.
Srujana é redatora freelancer de tecnologia e tem um diploma de quatro anos em Ciência da Computação. Escrever sobre vários tópicos, incluindo ciência de dados, computação em nuvem, desenvolvimento, programação, segurança e muitos outros, é algo natural para ela. Ela gosta de literatura clássica e de explorar novos destinos.