Como retrocede (reiniciar) um repositório Git para um commit em particular? [duplicado]

[[2] esta pergunta já tem uma resposta aqui:

Clonei um repositório Git e depois tentei rolar de volta para um commit em particular no início do processo de desenvolvimento. Tudo o que foi adicionado ao repositório depois desse ponto não é importante para mim, então eu quero omitir todas as alterações subsequentes do meu código-fonte local.

No entanto, quando tento voltar a rolar na ferramenta GUI, não actualiza o meu sistema de ficheiros local-acabo sempre com o código-fonte mais recente para o projecto.

Qual é a maneira correta de apenas obter a fonte de um repositório como de um commit em particular na história do projeto e omitir todas as atualizações posteriores?

 640
git
Author: Retro Gamer, 2009-10-24

4 answers

git reset --hard <tag/branch/commit id>

Notas:

  • git reset sem a opção --hard reinicia o histórico de commit, mas não os ficheiros. Com a opção --hard, os ficheiros na árvore de trabalho também são repostos. ( utilizador creditado)

  • Se você deseja enviar esse estado para que o repositório remoto também aponte para o commit rolled back Faça: git push <reponame> -f (utilizador creditado)

 1002
Author: kauppi, 2017-08-18 23:59:28

Actualização:

Por causa das mudanças na forma como os ramos de rastreamento são criados e empurrados, já não recomendo mudar o nome dos ramos. Isto é o que eu recomendo agora:

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

git branch crazyexperiment

git branch <name> o comando irá deixá-lo com o seu ramo actual ainda verificado.)

Reinicie a sua ramificação actual para a sua persistência desejada com git reset:

git reset --hard c2e7af2b51

(Substituir c2e7af2b51 pela persistência que deseja volta para lá.)

Quando decidires que o teu ramo maluco não contém nada de útil, podes apagá-lo com:
git branch -D crazyexperiment

É sempre bom quando se está a começar com comandos git modificadores de histórico (reinicialização, ajuste de base) para criar ramificações de salvaguarda antes de as Executar. Eventualmente, quando estiveres confortável, não vais achar necessário. Se você modificar o seu histórico de uma forma que você não quer e não criou um branch de backup, olhe para git reflog. Git keeps commits around for quite while even if there are no branches or tags aponting to them.

Resposta Original:

Uma maneira um pouco menos assustadora de fazer isto do que o método é criar um novo ramo. Vamos assumir que você está no ramo master e o commit que você quer voltar é c2e7af2b51.

Mudar o nome do seu ramo principal actual:

git branch -m crazyexperiment

Vê o teu bom compromisso:

git checkout c2e7af2b51
Faça aqui o seu novo ramo mestre.
git checkout -b master

Agora você ainda tenha a sua experiência louca por perto se quiser olhar para ela mais tarde, mas o seu ramo mestre está de volta ao seu último ponto conhecido, pronto para ser adicionado. Se realmente quiser deitar fora a sua experiência, pode usar:

git branch -D crazyexperiment
 376
Author: Neall, 2014-05-17 13:18:42

Para aqueles com um Git GUI bent, você também pode usar gitk.

Carregue com o botão direito na persistência para a qual deseja regressar e seleccione "repor a ramificação principal aqui". Então escolha com força no próximo menu.

 12
Author: ReggieB, 2013-04-04 13:57:07
Quando dizes a "ferramenta GUI", presumo que estejas a usar o Git para o Windows.

IMPORTANTE, Eu recomendaria Muito criar um novo ramo para fazer isso se você ainda não fez. Assim, o vosso mestre pode permanecer o mesmo enquanto testam as vossas mudanças.

Com o GUI você precisa 'rolar para trás este commit' como você tem com o histórico à direita de sua vista. Então você vai notar que você tem todos os arquivos indesejados como alterações para enviar à esquerda. Agora você precisa clicar com o botão direito sobre o título cinzento acima de todos os ficheiros não encomendados e seleccione 'ignorar as alterações'. Isto irá ajustar seus arquivos de volta a como eles eram nesta versão.

 1
Author: huff, 2013-10-14 14:33:42