ti-enxame.com

Revertendo para um commit específico baseado no commit id com o Git?

Com git log, recebo uma lista de commits que fiz até agora.

commit f5c5cac0033439c17ebf905d4391dc0705dbd5f1
Author: prosseek 
Date:   Fri Sep 3 14:36:59 2010 -0500

    Added and modified the files.

commit c14809fafb08b9e96ff2879999ba8c807d10fb07
Author: prosseek 
Date:   Tue Aug 31 08:59:32 2010 -0500

    Just simple test for core.editor.

... etc ...
  • Como posso reverter para um commit específico? Por exemplo, o que devo fazer se eu quiser voltar para commit c14809fafb08b9e96ff2879999ba8c807d10fb07?

  • Existe outra maneira melhor/de voltar para um commit específico com o Git? Por exemplo, posso colocar um rótulo de cada confirmação para recuperá-lo com o rótulo?

245
prosseek

Você quer reverter seu repo para esse estado? Ou você só quer que seu repo local pareça assim?

se você fizer

git reset --hard c14809fa

Isso fará com que seu código local e histórico local sejam exatamente como estavam no commit. Mas então, se você quiser enviar isso para outra pessoa que tenha a nova história, ela falhará.

se você fizer

git reset --soft c14809fa

Ele fará com que seus arquivos locais sejam alterados para serem como eram, mas deixarão seu histórico, etc.

Então, o que exatamente você quer fazer com essa redefinição?

Editar -

Você pode adicionar "tags" ao seu repo .. e depois voltar para uma tag. Mas uma tag é apenas um atalho para o sha1.

Você pode marcar isso como TAG1. Então, um git reset --soft c14809fa, git reset --soft TAG1 ou git reset --soft c14809fafb08b9e96ff2879999ba8c807d10fb07 farão a mesma coisa.

420
bwawok

Eu acho que a resposta do bwawok está errada em algum momento:

se você fizer

git reset --soft c14809fa

Ele fará com que seus arquivos locais sejam alterados para serem como eram, mas deixarão seu histórico, etc.

De acordo com manual: git-reset , "git reset --soft" ...

não toca no arquivo de índice nem na árvore de trabalho (mas redefine a cabeça para <commit>, assim como todos os modos). Isso deixa todos os seus arquivos alterados "Changes to be committed", como o status do git colocaria.

Por isso, "removerá" novos commits do branch. Isto significa que, depois de olhar para o seu código antigo, você não pode ir para o mais novo commit neste branch novamente, facilmente. Portanto, ele faz o opositor como descrito por bwawok: Arquivos locais não são alterados (eles são exatamente como antes "git reset --soft"), mas o histórico é modificado (o branch é truncado após o commit especificado).

O comando para a resposta do bwawok pode ser:

git checkout <commit>

Você pode usar isso para dar uma olhada na revisão antiga: como meu código ficou ontem?

(Eu sei, eu deveria colocar isso em comentários para esta resposta, mas stackoverflow não me permite fazer isso! Minha reputação é muito baixa.)

155
Peter A

git reset c14809fafb08b9e96ff2879999ba8c807d10fb07 é o que você está procurando ...

22
Doches

Se você quiser forçar o problema, você pode fazer:

git reset --hard c14809fafb08b9e96ff2879999ba8c807d10fb07

manda você de volta para a aparência do seu clone no momento do check-in

4
kenzaraque