Como você reverte (redefine) um repository Git para um commit específico?

Eu clonei um repository Git e tentei revertê-lo para um commit em particular no início do processo de desenvolvimento. Tudo o que foi adicionado ao repository após esse ponto não é importante para mim, por isso quero omitir todas as alterações subseqüentes do meu código-fonte local.

No entanto, quando tento reverter na ferramenta GUI, ela não atualiza meu sistema de arquivos local – sempre acabo com o código-fonte mais recente do projeto.

Qual é a maneira correta de obter a origem de um repository a partir de um commit específico no histórico do projeto e omitir todas as atualizações posteriores?

git reset --hard  

Notas:

  • git reset sem a opção --hard redefine o histórico de commit, mas não os arquivos. Com a opção --hard os arquivos na tree de trabalho também são redefinidos. ( usuário creditado )

  • Se você deseja consolidar esse estado para que o repository remoto também aponte para o roll back commit: git push -f ( usuário creditado )

Atualizar:

Devido a alterações em como as ramificações de rastreamento são criadas e enviadas, não é mais recomendável renomear filiais. Isto é o que eu recomendo agora:

Faça uma cópia do ramo no seu estado atual:

 git branch crazyexperiment 

(O comando git branch deixará você com sua ramificação atual ainda com check-out.)

Redefina sua ramificação atual para sua confirmação desejada com git reset :

 git reset --hard c2e7af2b51 

(Substitua c2e7af2b51 pelo commit para o qual você deseja voltar).

Quando você decide que o seu ramo experimental maluco não contém nada de útil, você pode excluí-lo com:

 git branch -D crazyexperiment 

É sempre bom quando você está começando com comandos git de modificação de histórico (reset, rebase) para criar ramificações de backup antes de executá-las. Eventualmente, uma vez que você esteja confortável, não achará necessário. Se você modificar seu histórico de uma maneira que não deseja e não criou um branch de backup, veja o git reflog . O Git mantém commit por um bom tempo, mesmo que não haja ramificações ou tags apontando para eles.

Resposta original:

Uma maneira um pouco menos assustadora de fazer isso do que o método ” git reset --hard do git reset --hard é criar um novo branch. Vamos supor que você esteja no branch master e o commit que você quer voltar é c2e7af2b51 .

Renomeie seu ramo mestre atual:

 git branch -m crazyexperiment 

Confira seu bom commit:

 git checkout c2e7af2b51 

Faça o seu novo branch master aqui:

 git checkout -b master 

Agora você ainda tem o seu experimento louco, se quiser dar uma olhada nele mais tarde, mas o seu ramo mestre está de volta ao seu último ponto conhecido, pronto para ser adicionado. Se você realmente quiser jogar fora sua experiência, você pode usar:

 git branch -D crazyexperiment 

Para aqueles com um git gui dobrado, você também pode usar o gitk.

Clique com o botão direito do mouse no commit para o qual deseja retornar e selecione “Reset branch master to here”. Em seguida, escolha a partir do próximo menu.

Quando você diz “Ferramenta GUI”, eu suponho que você esteja usando o Git For Windows.

IMPORTANTE, eu recomendo criar uma nova ramificação para fazer isso se você ainda não tiver feito isso. Dessa forma, seu mestre pode permanecer o mesmo enquanto você testa suas alterações.

Com a GUI, você precisa “reverter esse commit” como tem com o histórico à direita de sua visualização. Então você notará que tem todos os arquivos indesejados como alterações para confirmar à esquerda. Agora você precisa clicar com o botão direito do mouse sobre o título cinza acima de todos os arquivos não confirmados e selecionar “desconsiderar as alterações”. Isso irá definir seus arquivos de volta para como eles estavam nesta versão.