Como desfazer commits recentes no git?

Eu acidentalmente enviei os arquivos errados para o Git , mas ainda não enviei um commit para o servidor.

Como posso cancelar esses commits do repositório local?

18990
29 мая '09 в 21:09 2009-05-29 21:09 Hamza Yerlikaya perguntou 29 maio '09 em 21:09 2009-05-29 21:09
@ 92 respostas

Desfazer e refazer

20501
29 мая '09 в 21:13 2009-05-29 21:13 Resposta fornecida por Esko Luontola às 09:13 2009-05-29 21:13

Cancelar um commit é um pouco assustador se você não sabe como funciona. Mas, na verdade, é surpreendentemente fácil, se você entender.

Digamos que você o tenha, onde C é sua CABEÇA e (F) é o estado de seus arquivos.

  (F) ABC ↑ master 

Você deseja redefinir o commit C e nunca mais vê-lo novamente . Você faz isso:

 git reset --hard HEAD~1 

Resultado:

  (F) AB ↑ master 

Agora B - CABEÇA. Desde que você usou --hard , seus arquivos retornam ao seu estado quando você comete B.

Ah, mas suponha que commitar C não seja um desastre, mas um pouco. Você deseja cancelar um commit, mas salve suas alterações para uma pequena edição antes de fazer o melhor commit. Começando aqui de novo, com C como sua cabeça:

  (F) ABC ↑ master 

Você pode fazer isso deixando --hard :

border=0
 git reset HEAD~1 

Nesse caso, o resultado é:

  (F) ABC ↑ master 

Em ambos os casos, HEAD é apenas um ponteiro para o último commit. Quando você faz um git reset HEAD~1 , você diz ao Git para mover o ponteiro HEAD de volta uma confirmação. Mas (a menos que você use --hard ) você deixa seus arquivos como estavam. Agora git status mostra as mudanças que você registrou em C. Você não perdeu nada!

Para um toque leve, você pode até cancelar o commit, mas deixe seus arquivos e índice :

 git reset --soft HEAD~1 

Isso não só deixa seus arquivos em paz, mas até deixa seu índice sozinho. Quando você faz o git status , você verá que o índice contém os mesmos arquivos de antes. De fato, logo após este comando, você pode executar git commit e você irá refazer o mesmo commit que você acabou de fazer.

Mais uma coisa: suponha que você destruiu um commit, como no primeiro exemplo, mas depois descobriu que precisava disso no final ? Sem sorte, certo?

Não, ainda há uma maneira de recuperá-lo. Digite git reflog , e você verá uma lista de (parcialmente) commit ShAS (ou seja, hash) que você moveu para encontrar o commit que você destruiu, e faça-o.

 git checkout -b someNewBranchName shaYouDestroyed 

Você agora ressuscitou este commit. Os comitês não são realmente destruídos no Git por cerca de 90 dias, então normalmente você pode retornar e salvar um que você não queria se livrar.

10099
29 июля '11 в 1:22 2011-07-29 01:22 a resposta é dada por Ryan Lundy 29 de julho de 2011 às 1:22 2011-07-29 01:22

Demorei algum tempo para entender, então talvez isso ajude alguém ...

Existem duas maneiras de "desfazer" seu último commit, dependendo se você fez um relatório público (clicado no repositório remoto):

Como cancelar um commit local

Deixe-me dizer que eu fiz isso localmente, mas agora eu quero remover essa fixação.

 git log commit 101: bad commit # latest commit, this would be called 'HEAD' commit 100: good commit # second to last commit, this is the one we want 

Para restaurar tudo antes de ser o último commit, precisamos executar um reset antes de confirmar antes de HEAD :

 git reset --soft HEAD^ # use --soft if you want to keep your changes git reset --hard HEAD^ # use --hard if you don't care about keeping the changes you made 

Agora o git log mostrará que nosso último commit foi removido.

Como cancelar uma correção pública

Se você já disponibilizou seus commits publicamente, você precisará criar um novo commit que "retorne" as mudanças que você fez no commit anterior (o atual HEAD).

 git revert HEAD 

Agora suas alterações serão desfeitas e prontas para serem confirmadas:

 git commit -m 'restoring the file I removed by accident' git log commit 102: restoring the file I removed by accident commit 101: removing a file we don't need commit 100: adding a file that we need 

Para mais informações, confira Git Basics - Cancel Things.

1889
16 июня '11 в 20:27 2011-06-16 20:27 a resposta é dada por Andrew em 16 de junho de 2011 às 20:27 2011-06-16 20:27

Adicione / remova arquivos para obter o que você deseja:

 git rm classdir git add sourcedir 

Então mude o commit:

 git commit --amend 

A correção anterior, errônea, será editada para refletir o novo estado do índice - em outras palavras, parecerá que você nunca cometeu um erro em primeiro lugar.

Observe que você só deve fazer isso se ainda não tiver clicado. Se você clicou, você só tem que se comprometer a corrigi-lo normalmente.

1664
29 мая '09 в 21:16 2009-05-29 21:16 a resposta é dada bdonlan May 29, '09 at 21:16 2009-05-29 21:16
926
29 мая '09 в 21:13 2009-05-29 21:13 Lennart Koopmann respondeu em 21:09 2009-05-29 21:13

Para alterar o último commit

Substitua arquivos no índice:

 git rm --cached *.class git add *.java 

Então, se for um ramo privado, mude o commit:

 git commit --amend 

Ou, se esta for uma ramificação compartilhada, execute um novo commit:

 git commit -m 'Replace .class files with .java files' 


( para mudar o commit anterior , use um rebase interativo incrível)


ProTip ™: adicione *.class ao gitignore para parar esta repetição.


Para devolver uma correção

Alterar um commit é uma solução ideal se você precisar alterar o último commit, mas o reset solução mais geral.

Você pode redefinir o git para qualquer equipamento usando:

 git reset @~N 

Onde N é o número de confirmações antes de HEAD , e @~ retorna para o commit anterior.

Então, ao invés de fazer alterações em um commit, você pode usar:

 git reset @~ git add *.java git commit -m "Add .java files" 

Verifique a git help reset , em particular, as --soft --mixed e --hard para entender melhor o que ela faz.

Reflog

Se você ficar confuso, você sempre pode usar o reflog para encontrar commits remotos:

 $ git reset @~ $ git reflog c4f708b HEAD@{0}: reset: moving to @~ 2c52489 HEAD@{1}: commit: added some .class files $ git reset 2c52489 ... and you're back where you started 


707
31 июля '10 в 12:39 2010-07-31 12:39 a resposta é dada Zaz 31 de julho '10 às 12:39 2010-07-31 12:39

Use git revert <commit-id>

Para obter um ID de correção, basta usar o git log

589
25 мая '12 в 19:04 2012-05-25 19:04 a resposta é dada por Jaco Pretorius May 25, '12 at 19:04 2012-05-25 19:04

Se você planeja cancelar o commit local completamente, não importa o que você muda, você fez um commit, e se você não se preocupar, apenas execute o seguinte comando.

 git reset --hard HEAD^1 

(Este comando irá ignorar todos os seus compromissos, e suas alterações serão completamente perdidas da sua árvore de trabalho local). Se você deseja cancelar uma confirmação, mas deseja fazer alterações na área de preparação (antes de confirmar, assim como após o git add ), execute o seguinte comando.

 git reset --soft HEAD^1 

Agora seus arquivos fixos estão na área de preparação. Suponha que, se você quiser exceder os arquivos, porque precisa editar o conteúdo incorreto, execute o seguinte comando

 git reset HEAD 

Agora os arquivos transferidos vêm da área em fases para a área não entregue. Agora os arquivos estão prontos para edição, portanto, não importa o que você altere, você deseja ir para editá-lo e adicioná-lo e criar um novo / novo commit.

Mais

472
31 янв. a resposta é dada Madhan Ayyasamy 31 de janeiro 2013-01-31 10:06 '13 às 10:06 2013-01-31 10:06

Se você tiver o Git Extras instalado, você pode executar o git undo para desfazer o último commit. git undo 3 cancela os últimos 3 commits.

451
13 дек. a resposta é dada nickf 13 dez. 2011-12-13 13:18 '11 às 13:18 2011-12-13 13:18

Eu queria cancelar os últimos 5 commits no nosso repositório compartilhado. Eu olhei para o ID de revisão que eu queria reverter. Então eu digitei o seguinte.

 prompt> git reset --hard 5a7404742c85 HEAD is now at 5a74047 Added one more page to catalogue prompt> git push origin master --force Total 0 (delta 0), reused 0 (delta 0) remote: bb/acl: neoneye is allowed. accepted payload. To git@bitbucket.org:thecompany/prometheus.git + 09a6480...5a74047 master -> master (forced update) prompt> 
419
06 апр. a resposta é dada neoneye 06 abr. 2012-04-06 16:58 '12 at 4:58 pm 2012-04-06 16:58

Eu prefiro usar git rebase -i para esta tarefa, porque há uma boa lista onde eu posso selecionar commits para me livrar. Pode não ser tão simples como algumas das outras respostas aqui, mas parece certo.

Selecione o número de commits que você quer listar, então chame-o (para pegar os últimos três)

 git rebase -i HEAD~3 

Lista de amostras

 pick aa28ba7 Sanity check for RtmpSrv port pick c26c541 RtmpSrv version option pick 58d6909 Better URL decoding support 

O Git irá então remover o commit de qualquer linha a ser deletada.

397
25 окт. Resposta dada por Steven Penny em 25 Out 2012-10-25 06:41 '12 at 6:41 am 2012-10-25 06:41

Como corrigir o commit local anterior

Use git-gui (ou equivalente) para executar git commit --amend . Na GUI, você pode adicionar ou remover arquivos individuais da confirmação. Você também pode alterar a mensagem de confirmação.

Como cancelar o commit local anterior

Simplesmente retorne sua filial para sua localização anterior (por exemplo, usando gitk ou git rebase ). Em seguida, reaplique as alterações da cópia salva. Após a coleta de lixo em seu armazenamento local será como o fato de que o commit indesejado nunca ocorreu. Para fazer tudo isso em um comando, use git reset HEAD~1 .

Uma palavra de advertência : o uso descuidado do git reset é uma boa maneira de confundir sua cópia de trabalho. Eu recomendo iniciantes Git para evitar isso, se puderem.

Como cancelar um commit público

Reverse select cherry ( git-revert ) para descartar as alterações.

Se você ainda não fez outras alterações no seu tópico, você pode simplesmente ...

 git revert --no-edit HEAD 

Em seguida, envie a ramificação atualizada para o repositório comum.

O histórico de commits mostrará os dois commits separadamente.


Opcional: corrija a ramificação privada no repositório público

Isso pode ser perigoso - verifique se você tem uma cópia local do ramo.

Observe também: você não quer fazer isso se alguém estiver trabalhando no ramo.

 git push --delete (branch_name) ## remove public version of branch 

Limpe sua filial localmente e, em seguida, empurre ...

 git push origin (branch_name) 

No caso normal, você provavelmente não precisa se preocupar que seu histórico de commits em uma ramificação privada não seja afetado. Basta clicar em um commit subsequente (veja “Como cancelar um commit público” acima), e depois fazer uma mesclagem de squash para esconder a história.

382
23 апр. a resposta é dada nobar 23 abr 2013-04-23 20:27 '13 às 20:27 2013-04-23 20:27

Se você cometeu um erro, mas não clicou,

 git reset --soft HEAD~1 

HEAD ~ 1 é a abreviatura de fixação na frente da cabeça. Alternativamente, você pode consultar o hash SHA-1 se quiser redefini-lo. --soft irá remover o commit, mas ele deixará todos os seus arquivos modificados "Alterações serão feitas", como o status do git diria.

Se você quiser se livrar de quaisquer alterações nos arquivos monitorados na árvore de trabalho, como a fixação antes que a voz use " --hard ".

Ou

Se você já clicou e alguém puxou, o que geralmente é da minha conta, não é possível usar o git reset. No entanto, você pode fazer git revert,

 git revert HEAD 

Isso criará uma nova correção, que cancela tudo inserido por uma correção aleatória.

307
03 сент. a resposta é dada santos_mgr 03 set . 2014-09-03 10:15 '14 às 10:15 am 2014-09-03 10:15

Se você quiser cancelá-lo permanentemente, e clonou algum repositório

O ID da correção pode ser visto.

 git log 

Então você pode fazer

 git reset --hard <commit_id> git push origin <branch_name> -f 
303
17 мая '13 в 16:02 2013-05-17 16:02 a resposta é dada por poorva em 17 de maio de '13 às 4:02 2013-05-17 16:02

No SourceTree (GUI para GitHub), você pode clicar com o botão direito do mouse no commit e executar o Reverse Fix. Isso deve desfazer suas alterações.

No terminal:

Você também pode usar:

 git revert 

Ou:

256
28 июня '13 в 13:18 2013-06-28 13:18 a resposta é dada por Varun Parakh em 28 de junho de 2013 às 13:18 2013-06-28 13:18

Equipe única:

241
05 марта '14 в 16:55 2014-03-05 16:55 a resposta é dada por Manish Shrivastava em 05 de março '14 às 16:55 2014-03-05 16:55

Apenas redefina executando o comando abaixo usando git :

 git reset --soft HEAD~1 

Explique que o que o git reset faz basicamente é reset para qualquer --soft você queira retornar, então se você o mesclar com --soft , ele retornará, mas salvará as mudanças em seus arquivos, então você retornará à cena onde um arquivo foi adicionado, HEAD é o chefe da ramificação, e se você combinar com ~1 (neste caso, você também usa HEAD^ ), ele retornará para apenas um comando que você quer ...

Eu crio as etapas na imagem abaixo com mais detalhes para você, incluindo todas as etapas que podem ocorrer em situações reais e a execução do código:

2019

Como cancelar o último git?

Para restaurar tudo antes do último commit, precisamos redefinir a correção para HEAD.

  1. Se você não quiser salvar suas alterações, você fez:

     git reset --hard HEAD^ 
  2. Se você quiser salvar suas alterações:

     git reset --soft HEAD^ 

Agora verifique seu log git. Isso mostrará que nossa última correção foi removida.

214
23 апр. a resposta é dada a Ranjithkumar Ravi em 23 de abril 2014-04-23 14:21 '14 às 14:21 2014-04-23 14:21

Use o reflog para encontrar o estado correto.

 git reflog 

2019

172
07 янв. Resposta dada por Shubham Chaudhary 07 jan 2014-01-07 01:34 '14 às 1:34 2014-01-07 01:34

"Redefinir a árvore de trabalho antes do último commit"

 git reset --hard HEAD^ 

"Limpar arquivos desconhecidos da árvore de trabalho"

 git clean 

veja - referência rápida do Git

NOTA Este comando irá remover o commit anterior, então use com cuidado! git reset --hard mais seguro -

167
03 окт. resposta dada Ravi_Parmar Oct 03. 2013-10-03 15:43 '13 às 15:43 2013-10-03 15:43

Primeira execução:

 git reflog 

Ele mostrará todas as ações possíveis que você realizou em seu repositório, por exemplo, commit, merge, pull, etc.

Então faça:

 git reset --hard ActionIdFromRefLog 
150
11 окт. a resposta é dada por U. Ali em 11 de outubro. 2013-10-11 17:41 '13 às 17:41 2013-10-11 17:41

Cancelar último commit:

git reset --soft HEAD^ ou git reset --soft HEAD~

Isto irá desfazer o último commit.

Aqui --soft significa redefinir as configurações.

HEAD~ or HEAD^ significa ir para um commit antes do HEAD.


Substitua o último commit por um novo:

 git commit --amend -m "message" 

Ele substituirá o último commit por um novo fixador.

141
06 марта '16 в 14:53 2016-03-06 14:53 a resposta é dada akshay_rahar March 06 '16 at 14:53 2016-03-06 14:53

Outra maneira:

Faça uma solicitação para a ramificação que você deseja retornar e, em seguida, retorne a cópia de trabalho local de volta para a confirmação que deseja que seja a última no servidor remoto (depois que ela for executada). Para fazer isso, cliquei com o botão direito do mouse no SourceTree e selecione "Reset BRANCHNAME to this commit".

Em seguida, vá para o diretório do repositório local e execute o seguinte comando:

 git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME 

Isso excluirá todas as confirmações após a atual no repositório local, mas apenas para uma ramificação.

136
13 мая '13 в 20:12 2013-05-13 20:12 a resposta é dada CommaToast 13 de maio de 2013 às 8:12 pm 2013-05-13 20:12

Entre no git log e encontre o código hash mais recente e digite:

 git reset <the previous co> 
127
15 мая '13 в 16:12 2013-05-15 16:12 a resposta é dada por user853293 May 15 '13 em 16:12 2013-05-15 16:12

No meu caso, eu acidentalmente fiz alguns arquivos que eu não queria. Então eu fiz o seguinte, e funcionou:

 git reset --soft HEAD^ git rm --cached [files you do not need] git add [files you need] git commit -c ORIG_HEAD 

Verificar resultados com gitk ou git log --stat

124
18 июля '13 в 9:41 2013-07-18 09:41 a resposta é dada por egridasov 18 de julho de '13 at 9:41 2013-07-18 09:41

Use o SourceTree (uma ferramenta gráfica para o Git) para ver seus commits e tree. Você pode redefini-la manualmente clicando com o botão direito do mouse.

113
29 авг. A resposta é dada iOS Coder 29 ago. 2013-08-29 19:18 '13 às 19:18 2013-08-29 19:18

Para retornar à revisão anterior, exclua permanentemente todas as alterações não confirmadas:

 git reset --hard HEAD~1 
111
28 авг. a resposta é dada pelo dia 28 de agosto. 2014-08-28 19:03 '14 às 19:03 2014-08-28 19:03

Existem dois cenários principais.

Você não pressionou o commit

Se o problema estiver relacionado a arquivos adicionais que você tenha confirmado (e você não quiser usá-los no repositório), poderá excluí-los com git rm e, em seguida, --amend with --amend

 git rm <pathToFile> 

Вы также можете удалить целые каталоги с помощью -r или даже объединить с другими командами Bash

 git rm -r <pathToDirectory> git rm $(find -name '*.class') 

После удаления файлов вы можете зафиксировать с помощью опции --amend

 git commit --amend -C HEAD # the -C option is to use the same commit message