Como devolver o repositório Git ao commit anterior

Como posso retornar de um estado atual para um instantâneo obtido em uma correção específica?

Se eu fizer git log , então eu recebo a seguinte saída:

 $ git log commit a867b4af366350be2e7c21b8de9cc6504678a61b' Author: Me <me@me.com> Date: Thu Nov 4 18:59:41 2010 -0400 blah blah blah... commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4 Author: Me <me@me.com> Date: Thu Nov 4 05:13:39 2010 -0400 more blah blah blah... commit 0766c053c0ea2035e90f504928f8df3c9363b8bd Author: Me <me@me.com> Date: Thu Nov 4 00:55:06 2010 -0400 And yet more blah blah... commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50 Author: Me <me@me.com> Date: Wed Nov 3 23:56:08 2010 -0400 Yep, more blah blah. 

Como voltar para a fixação a partir de 3 de novembro, ou seja corrigir 0d1d7fc ?

6500
06 нояб. definir por Crazy Serb 06 Nov. 2010-11-06 19:58 '10 às 19:58 2010-11-06 19:58
ответ 41 respostas
  • 1
  • 2

Depende muito do que você quer dizer com "reverter".

Mude temporariamente para outra correção.

Se você quiser retornar temporariamente a ele, engane-se e retorne ao local onde está, tudo o que você precisa fazer é verificar a fixação desejada:

 # This will destroy any local modifications. # Don't do it if you have uncommitted work you want to keep. git reset --hard 0d1d7fc32 # Alternatively, if there work to keep: git stash git reset --hard 0d1d7fc32 git stash pop # This saves the modifications, then reapplies that patch after resetting. # You could get merge conflicts, if you've modified things which were # changed since the commit you reset to. 

Se você errou, já descartou as alterações locais, mas pode pelo menos voltar para onde estava antes, redefinindo as configurações novamente.

Cancelar commits publicados com novos commits

Por outro lado, se você publicou esse trabalho, provavelmente não deseja redefinir o ramo, pois ele reescreve a história de maneira eficaz. Nesse caso, você pode retornar o commit. Com o Git, revert tem um significado muito específico: crie um commit usando um patch reverso para desfazê-lo. Então você não reescreve nenhuma história.

git-revert manpage git-revert realmente cobre muito disso na descrição.  Outro link útil é a seção git-scm.com, que discute git-revert . 

Se você decidir que não deseja retornar no final, poderá retornar o contrário (conforme descrito aqui) ou retornar antes de retornar (consulte a seção anterior).

Você também pode achar essa resposta útil nesse caso:
Como mover a cabeça de volta para o lugar anterior? (Cabeça separada)

8356
06 нояб. A resposta é dada por Cascabel 06 Nov. 2010-11-06 20:04 '10 às 20:04 2010-11-06 20:04

Retornar uma cópia de trabalho para o último commit

Para retornar ao commit anterior, ignorando quaisquer alterações:

 git reset --hard HEAD 

onde HEAD é a última correção em seu segmento atual.

border=0

Retornando uma cópia de trabalho para um commit mais antigo

Para retornar ao commit, que é maior que o último commit:

1396
21 авг. boulder_ruby resposta 21 de ago 2012-08-21 09:19 '12 em 9:19 2012-08-21 09:19

Existem muitas respostas difíceis e perigosas, mas na verdade é fácil:

 git revert --no-commit 0766c053..HEAD git commit 

Isso retornará tudo de HEAD para um hash commit, o que significa que ele recria esse estado de confirmação na árvore de trabalho, como se todo commit já tivesse sido retornado. Então você pode consertar a árvore atual, e criará uma correção completamente nova, substancialmente equivalente à correção, que você “retornou”.

(O flag --no-commit permite que o git retorne todos os commits ao mesmo tempo - caso contrário, você será solicitado a enviar uma mensagem para cada commit no intervalo, sujando seu histórico com novos commits desnecessários.)

Essa é uma maneira fácil e segura de reverter para um estado anterior . Nenhum histórico é destruído, portanto, ele pode ser usado para commits que já foram publicados.

1361
12 февр. a resposta é dada por Yarin em 12 de fevereiro. 2014-02-12 07:18 '14 às 7:18 am 2014-02-12 07:18

A melhor opção para mim e talvez para os outros é a opção de reset do Git:

 git reset --hard <commidId>  git clean -f 

Foi a melhor opção para mim! É simples, rápido e eficiente!


Nota: Como mencionado nos comentários, não faça isso se você compartilhar sua ramificação com outras pessoas que tenham cópias de commits antigos.

Também a partir dos comentários, se você quiser usar o método menos "ballzy", você pode usar

git clean -i

173
22 окт. A resposta é dada por Pogrindis em 22 de outubro. 2013-10-22 14:53 '13 às 14:53 2013-10-22 14:53

Antes de responder, adicione um pouco de fundo, explicando o que HEAD .

First of all what is HEAD?

HEAD é simplesmente uma referência à atual (última) confirmação no thread atual. A qualquer momento pode haver apenas uma HEAD (excluindo git worktree ).

O conteúdo de HEAD armazenado dentro de .git/HEAD e contém 40 bytes de SHA-1 da confirmação atual.


detached HEAD

Se você não estiver usando o último commit, isso significa que HEAD aponta para o commit anterior no histórico, ele é chamado detached HEAD .

2019

06 февр. A resposta é dada CodeWizard 06 fev 2015-02-06 00:56 '15 às 0:56 2015-02-06 00:56

Se você quiser fazer overclock, apague a última mensagem de commit e coloque os arquivos modificados na fila, você deve usar o comando:

 git reset --soft HEAD~1 
  • --soft indica que os arquivos desbloqueados devem ser salvos como arquivos de trabalho, opostos a --hard , que são descartados.
  • HEAD~1 - última correção. Se você quiser reverter 3 correções, você pode usar HEAD~3 . Se você quiser reverter para um número de revisão específico, também poderá fazer isso usando seu SHA-hash.

Este é um comando extremamente útil em situações em que você fez a coisa errada e deseja cancelar este último commit.

Fonte: http://nakkaya.com/2009/09/24/git-delete-last-commit/

116
04 марта '14 в 20:25 2014-03-04 20:25 Resposta é dada por Stephen Ostermiller em 04 de março '14 às 20:25 2014-03-04 20:25

Eu tentei muitas maneiras de desfazer as alterações locais no Git, e parece que funciona melhor se você quiser apenas voltar ao último estado de confirmação.

 git add .  git checkout master -f 

Breve descrição:

  • Não irá criar nenhum commit, como o git revert faz.
  • Ele não irá separar seu HEAD como git checkout <commithashcode> .
  • Ele substituirá todas as alterações locais e removerá todos os arquivos adicionados desde a última confirmação no encadeamento.
  • Ele só funciona com os nomes dos ramos, então você só pode retornar para o último commit no branch dessa maneira.

Eu encontrei uma maneira muito mais conveniente e fácil de alcançar os resultados acima:

 git add .  git reset --hard HEAD 

onde HEAD indica o último commit no seu thread atual.

Este é o mesmo código que boulder_ruby, mas eu adicionei git add . antes de git reset --hard HEAD para apagar todos os novos arquivos criados desde o último commit, pois é isso que a maioria das pessoas espera quando eu retornar ao último commit.

104
29 июля '12 в 14:01 2012-07-29 14:01 a resposta é dada Roman Minenok 29 de julho, '12 em 2:01 pm 2012-07-29 14:01

Você pode fazer isso com os dois comandos a seguir:

 git reset --hard [previous Commit SHA id here] git push origin [branch Name] -f 

Ele removerá o commit anterior do Git.

Se você quiser salvar suas alterações, você também pode usar:

 git reset --soft [previous Commit SHA id here] 

Em seguida, salvará suas alterações.

90
12 дек. A resposta é dada kiran boghra 12 dez. 2014-12-12 09:52 '14 às 9:52 am 2014-12-12 09:52

Digamos que você tenha os seguintes commits em um arquivo de texto chamado ~/commits-to-revert.txt (usei git log --pretty=oneline para obtê-los)

 fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219 0c27ecfdab3cbb08a448659aa61764ad80533a1b f85007f35a23a7f29fa14b3b47c8b2ef3803d542 e9ec660ba9c06317888f901e3a5ad833d4963283 6a80768d44ccc2107ce410c4e28c7147b382cd8f 9cf6c21f5adfac3732c76c1194bbe6a330fb83e3 fff2336bf8690fbfb2b4890a96549dc58bf548a5 1f7082f3f52880cb49bc37c40531fc478823b4f5 e9b317d36a9d1db88bd34831a32de327244df36a f6ea0e7208cf22fba17952fb162a01afb26de806 137a681351037a2204f088a8d8f0db6e1f9179ca 

Crie um script de shell bash para retornar cada um deles:

55
14 окт. a resposta é dada por Lance Caraccioli 14 de outubro. 2011-10-14 00:51 '11 às 0:51 2011-10-14 00:51

Alternativas Adicionais às Soluções Jefromi

As soluções da Jefromi são definitivamente as melhores, e você definitivamente deveria usá-las. No entanto, para completar, eu também queria mostrar essas outras soluções alternativas, que também podem ser usadas para retornar um commit (no sentido de que você cria um novo commit que reverte as mudanças para o commit anterior, como faz o git revert ).

Para ser claro, essas alternativas não são a melhor maneira de reverter para o commit , soluções Jefromi , mas eu só quero indicar que você também pode usar esses outros métodos para atingir o mesmo nível que git revert .

Alternativa 1: Reinicialização rápida e suave

Esta é uma versão ligeiramente modificada da solução de Charles Bailey para o Get SHA-hash commit de volta para o Git? :

53
29 июня '14 в 20:51 2014-06-29 20:51 a resposta é dada por user456814 junho 29 '14 às 20:51 2014-06-29 20:51

Nada funcionou para mim aqui, exceto essa combinação exata:

 git reset --hard <commit_hash> git push origin <branch_name> --force 

A chave aqui é empurrar forçado, sem mensagens adicionais sobre fixação / fixação, etc.

53
13 февр. a resposta é dada serdarsenay 13 fev . 2018-02-13 01:40 '18 às 1:40 2018-02-13 01:40

Aqui está uma maneira muito mais fácil de retornar ao commit anterior (e tê-lo em um estado não gerenciado, faça o que quiser com ele):

 git reset HEAD~1 

Portanto, não há necessidade de corrigir identificadores, etc. :)

50
29 февр. a resposta é dada por Paul Walczewski em 29 de fevereiro. 2016-02-29 11:40 '16 às 11:40 2016-02-29 11:40

Ok, de volta ao commit anterior no git é bem simples ...

Reverter sem salvar as alterações:

 git reset --hard <commit> 

Volte e salve as alterações:

 git reset --soft <commit> 

Explique que usando o git reset, você pode redefinir para um certo estado, geralmente com um hash de commits, como você viu acima.

Mas, como você pode ver, a diferença está em usar os dois flags --soft e --hard , o padrão é git reset usando o sinalizador --soft , mas é sempre recomendado usar este flag, eu explico cada flag:


--soft

O sinalizador padrão, conforme explicado, não exige que ele seja fornecido, não altera a árvore de trabalho, mas inclui todos os arquivos de mudança prontos para serem confirmados, portanto, você retorna ao estado de confirmação, no qual as alterações do arquivo se tornam inalteradas.


- difícil

Tenha cuidado com esse sinalizador, ele redefine a árvore de trabalho e todas as alterações nos arquivos monitorados desaparecem!


Eu também criei uma imagem abaixo que pode acontecer na vida real enquanto estiver trabalhando com o git:

2019

Supondo que você esteja falando sobre o host e o ramo apropriado (isso sugere que pode ser qualquer ramo de trabalho com o qual você esteja preocupado):

 # Revert local master branch to November 3rd commit ID git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50 # Revert remote master branch to November 3rd commit ID git push -f origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master 

Eu encontrei a resposta da postagem do blog Excluir um repositório Git remoto para um commit específico .

45
10 мая '16 в 20:21 2016-05-10 20:21 resposta dada a markreyes 10 de maio de '16 às 20:21 2016-05-10 20:21

Depois de todas as alterações, quando você pressionar todos esses comandos, talvez seja necessário usar:

 git push -f ... 

E não apenas git push .

34
05 сент. a resposta é dada por sivi 05 set . 2013-09-05 17:03 '13 às 17:03 2013-09-05 17:03

Existe um comando (não faz parte do kernel do Git, mas está no pacote git-extras ) especificamente para retornar e executar commits antigos:

 git back 

Na página man , também pode ser usado como tal:

 # Remove the latest three commits git back 3 
32
08 авг. a resposta é dada por Shadow Man 08 ago. 2013-08-08 21:30 '13 às 21:30 2013-08-08 21:30

Retornar ao último commit e ignorar todas as alterações locais:

 git reset --hard HEAD 
27
26 июля '16 в 16:13 2016-07-26 16:13 Resposta é dada por Mohammed Irfan Tirupattur em 26 de julho '16 às 16:13 2016-07-26 16:13

Selecione o retentor necessário e verifique-o.

 git show HEAD git show HEAD~1 git show HEAD~2 

até que você consiga a fixação desejada. Para forçar o HEAD a apontar isso,

 git reset --hard HEAD~1 

ou git reset --hard HEAD~2 ou qualquer outra coisa.

26
26 февр. a resposta é dada tonythomas01 26 de fevereiro 2014-02-26 15:52 '14 às 15:52 2014-02-26 15:52

Você pode concluir estas etapas iniciais e voltar ao git-repo.

  1. Puxe a última versão do seu repositório do Bitbucket usando o comando git pull --all .

  2. Execute o comando git log com -n 4 do seu terminal. O número após -n determina o número de confirmações no log, começando com o último commit em seu histórico local.

    $ git log -n 4

  3. Redefina git reset --hard HEAD~N histórico de seu repositório usando git reset --hard HEAD~N onde N é o número de commits que você quer reverter. No exemplo a seguir, o head será configurado para um commit, o último commit no histórico do repositório:

  4. Clique em uma alteração no git repo com git push --force para forçar uma alteração.

Se você quiser que o repositório git tenha um commit anterior

 git pull --all git reset --hard HEAD~1 git push --force 
24
06 апр. Resposta dada por Nanhe Kumar em 06 abr 2017-04-06 15:20 '17 às 15:20 2017-04-06 15:20

Este é outro método de redefinição direta para confirmação recente.

 git stash git stash clear 

Ele limpa diretamente todas as alterações feitas desde o último commit.

PS: Ele tem um pequeno problema; também apaga todas as alterações de cache recentemente salvas. Eu acho que na maioria dos casos isso não importa.

20
05 мая '16 в 14:43 2016-05-05 14:43 a resposta é dada por Point Networks 05 May '16 em 14:43 2016-05-05 14:43

Para limpar completamente o diretório do codificador de algumas mudanças aleatórias, usamos:

 git add -A . git reset --hard HEAD 

Apenas git reset --hard HEAD se livrar das mudanças, mas não vai se livrar dos "novos" arquivos. No caso deles, eles acidentalmente arrastaram uma pasta importante para algum lugar aleatório, e todos esses arquivos foram tratados como novos com o Git, então reset --hard não corrigiu. Executando git add -A . antecipadamente, ele rastreou todos eles explicitamente com o Git, que foi destruído com reset.

20
11 окт. Resposta dada por Chris Moschini em 11 Out 2015-10-11 03:10 '15 às 3:10 2015-10-11 03:10

Para salvar as alterações de um commit anterior para HEAD e ir para o commit anterior, execute:

 git reset <SHA> 

Se nenhuma alteração for necessária no commit anterior ao HEAD e simplesmente descartar todas as alterações, siga estas etapas:

 git reset --hard <SHA> 
20
28 июля '15 в 11:35 2015-07-28 11:35 a resposta é dada por Vishnu Atrai 28 de julho de 2015 às 11:35 2015-07-28 11:35

Acredito que algumas pessoas possam chegar a essa questão, querendo saber como a reversão fez as alterações feitas em seu proprietário - ou seja, jogar tudo fora e retornar à origem / proprietário e, nesse caso, faça o seguinte:

 git reset --hard origin/master 

https://superuser.com/questions/273172/how-to-reset-master-to-origin-master

19
05 февр. a resposta é dada nevster 05 fev . 2015-02-05 04:28 '15 às 4:28 2015-02-05 04:28

Reverter é um comando para confirmar confirmações.

 git revert <commit1> <commit2> 

Exemplo:

git revert 2h3h23233

É capaz de receber um intervalo da cabeça como mostrado abaixo. Aqui 1 diz: "Retorna a última correção".

git revert HEAD~1..HEAD

e então git push

16
20 авг. Resposta dada por Sireesh Yarlagadda 20 ago. 2015-08-20 17:45 '15 às 5:45 pm 2015-08-20 17:45

Reverter a confirmação mais recente:

 git reset --hard HEAD 

HEAD é simplesmente uma referência à atual (última) confirmação no thread atual. Só pode haver uma HEAD a qualquer momento.

Вернитесь к более старой команде: самым быстрым способом восстановления старой версии является использование команды reset :

 # Resets index to former commit git reset 56e05fced # Moves pointer back to previous HEAD git reset --soft HEAD@{1} # Updates working copy to reflect the new commit git reset --hard