Como desfazer as confirmações locais mais recentes no Git?

21062

Acidentalmente enviei os arquivos errados para o Git , mas ainda não enviei a confirmação para o servidor.

Como posso desfazer essas confirmações do repositório local?

Peter Mortensen
fonte
138
Antes de postar uma nova resposta, considere que já existem mais de 65 respostas para esta pergunta. Verifique se a sua resposta contribui com o que não está entre as respostas existentes.
Sazzad Hissain Khan
91
Você sabe o que o git precisa? git undo, é isso aí. Então a reputação que o git tem de lidar com os erros cometidos por nós meros mortais desaparece. Implemente pressionando o estado atual em uma pilha git antes de executar qualquer gitcomando. Isso afetaria o desempenho, portanto, seria melhor adicionar um sinalizador de configuração para habilitá-lo.
Yimin Rong
11
@YiminRong Isso pode ser feito com o aliasrecurso do Git : git-scm.com/book/en/v2/Git-Basics-Git-Aliases
Edric
3
@RomainValeri - Da mesma maneira que desfazer funciona em qualquer outro lugar.
Yimin Rong 25/03
1
@YiminRong Não comprá-lo. As pessoas ainda se atrapalham e desfazem as coisas para não serem desfeitas. Mas o mais importante, git reflogjá está próximo do que você descreve, mas oferece ao usuário mais controle sobre o que deve ser (des) feito. Mas por favor, não, "desfazer" não funciona da mesma maneira em todos os lugares, e as pessoas esperam muitas coisas diferentes para o recurso alcançar. Desfazer a última confirmação? Desfazer a última ação? Se a última ação foi um push, desfaça exatamente como (redefinir e empurrar) ou (reverter e empurrar)?
RomainValeri 25/03

Respostas:

22860

Desfazer uma confirmação e refazer

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. É isso que você deseja desfazer.
  2. Isso não faz nada na sua árvore de trabalho (o estado dos seus arquivos no disco), mas desfaz a confirmação e deixa as alterações que você cometeu em etapas (para que elas apareçam como "Alterações não preparadas para a confirmação" git status, então você precisará adicione-os novamente antes de confirmar). Se você única querer adicionar mais mudanças para cometer o anterior, ou mudar a mensagem de commit 1 , você poderia usar git reset --soft HEAD~em vez disso, que é como git reset HEAD~2 , mas deixa as alterações existentes encenado.
  3. Faça correções nos arquivos da árvore de trabalho.
  4. git add qualquer coisa que você queira incluir em seu novo commit.
  5. Confirme as alterações, reutilizando a mensagem de confirmação antiga. resetcopiou a cabeça antiga para .git/ORIG_HEAD; commitO with -c ORIG_HEADabrirá um editor, que inicialmente contém a mensagem de log do commit antigo e permite que você edite. Se você não precisar editar a mensagem, poderá usar a -Copção

Cuidado, no entanto, se você tiver adicionado novas alterações ao índice, o uso commit --amenddelas será adicionado ao seu commit anterior.

Se o código já foi enviado ao seu servidor e você tem permissões para substituir o histórico (rebase), então:

git push origin master --force

Você também pode olhar para esta resposta:

Como posso mover o HEAD de volta para um local anterior? (Cabeça desanexada) e Desfazer confirma

A resposta acima mostrará git reflog,qual é usado para descobrir o que é o SHA-1, que você deseja reverter. Depois de encontrar o ponto em que deseja desfazer, use a sequência de comandos conforme explicado acima.


1 Observe, no entanto, que você não precisa redefinir para uma confirmação anterior se tiver cometido um erro na sua mensagem de confirmação . A opção mais fácil é git reset(desfazer as alterações feitas desde então) e git commit --amend, em seguida , abrir o editor de mensagens de confirmação padrão preenchido previamente com a última mensagem de confirmação.

2 HEAD~ é o mesmo que HEAD~1. Além disso, consulte O que é o HEAD no git? . É útil se você deseja cancelar várias confirmações.

Mark Amery
fonte
472
E se o commit foi para a ramificação errada, você pode estar git checkout theRightBranchcom todos os estágios de mudanças. Como eu apenas tinha que fazer.
precisa saber é o seguinte
490
Se você estiver trabalhando no DOS, em vez de git reset --soft HEAD^precisar usar git reset --soft HEAD~1. O ^ é um caractere de continuação no DOS, portanto não funcionará corretamente. Além disso, --softé o padrão, portanto, você pode omiti-lo se quiser e apenas dizer git reset HEAD~1.
21811 Ryan Lundy
119
Os usuários do zsh podem obter: zsh: no matches found: HEAD^- você precisa escapar ^ iegit reset --soft HEAD\^
tnajdek
7
A resposta não está correta se, digamos por acidente, git commit -afoi emitida quando -adeveria ter sido deixada de fora. Nesse caso, é melhor não deixar de fora o --soft(que resultará em --mixedqual é o padrão) e, em seguida, você pode reorganizar as alterações que pretendia confirmar.
precisa saber é o seguinte
6
@IcyBrk git add é um comando. git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--chmod=(+|-)x] [--] [<pathspec>…​]
Ashraf.Shk786
10734

Desfazer um commit é um pouco assustador se você não sabe como ele funciona. Mas é realmente incrivelmente fácil se você entender.

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

   (F)
A-B-C
    ↑
  master

Você deseja remover o commit do C e nunca mais vê-lo e perder todas as alterações nos arquivos modificados localmente . Você faz isso:

git reset --hard HEAD~1

O resultado é:

 (F)
A-B
  ↑
master

Agora B é a CABEÇA. Como você usou --hard, seus arquivos são redefinidos para seus estados na confirmação B.

Ah, mas suponha que o commit C não tenha sido um desastre, mas apenas um pouco. Você deseja desfazer o commit, mas mantenha suas alterações um pouco para editar antes de fazer um commit melhor. Começando novamente a partir daqui, com C como sua CABEÇA:

   (F)
A-B-C
    ↑
  master

Você pode fazer isso, deixando de fora o --hard:

git reset HEAD~1

Nesse caso, o resultado é:

   (F)
A-B-C
  ↑
master

Nos dois 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 para um commit. Mas (a menos que você use --hard), você deixa seus arquivos como estavam. Então agoragit status , mostra as alterações que você registrou no C. Você não perdeu nada!

Para dar um toque mais leve, você pode até desfazer seu commit, mas deixar seus arquivos e seu índice :

git reset --soft HEAD~1

Isso não apenas deixa seus arquivos em paz, mas também deixa seu índice em paz. Ao fazê-lo git status, você verá que os mesmos arquivos estão no índice de antes. De fato, logo após esse comando, você poderia fazer git commite refazer o mesmo commit que acabou de ter.

Mais uma coisa: suponha que você destrua um commit como no primeiro exemplo, mas depois descubra que precisava dele afinal ? Muita sorte, certo?

Não, ainda há uma maneira de recuperá-lo. Digite git refloge você verá uma lista de commit (parcial) shas (ou seja, hashes) nos quais você se mudou. Encontre o commit que você destruiu e faça o seguinte:

git checkout -b someNewBranchName shaYouDestroyed

Agora você ressuscitou esse commit. As confirmações não são realmente destruídas no Git por cerca de 90 dias; portanto, você pode voltar e resgatar uma que você não queria se livrar.

Ryan Lundy
fonte
15
Cuidado! Isso pode não fazer o que você espera se seu commit incorreto for uma mesclagem (avanço rápido)! Se sua cabeça estiver em uma confirmação de mesclagem (por exemplo: recurso de ramificação mesclada no mestre), git reset --hard~1apontará a ramificação mestre para a última confirmação dentro da ramificação de recursos. Nesse caso, o ID de confirmação específico deve ser usado em vez do comando relativo.
22613 Chris Kerekes
90
Perdendo um ponto crucial: se o referido commit foi anteriormente "enviado" para o controle remoto, qualquer operação "desfazer", por mais simples que seja, causará enorme dor e sofrimento aos demais usuários que o têm em sua cópia local, quando eles fizerem um "git pull" no futuro. Portanto, se o commit já foi 'enviado', faça o seguinte: git revert <bad-commit-sha1-id> origem do git push:
FractalSpace
12
@FractalSpace, não causará "enorme dor e sofrimento". Eu fiz alguns empurrões de força ao usar o Git com uma equipe. Só é preciso comunicação.
Ryan Lundy
14
@ Kyralessa No meu local de trabalho, atrapalhar o fluxo de trabalho de toda a equipe e depois dizer a eles como consertar o sh * t não é chamado de 'comunicação'. a reescrita do git history é uma operação destrutiva que resulta na eliminação de partes do repositório. Insistir em seu uso, enquanto alternativas claras e seguras estão disponíveis, é simplesmente irresponsável.
FractalSpace 9/11
14
Eu queria destruir um commit e nunca mais vê-lo. Eu usei o seu exemplo, --hardmas o que eu não percebi é que todas as minhas mudanças não organizadas na minha árvore de trabalho também são destruídas! Ia confirmar esses arquivos como parte de uma confirmação posterior. Agora parece impossível recuperar esses arquivos - eu até tentei a solução sobre a qual você postou, reflogmas isso não restaurou as alterações anteriormente não apresentadas.
Adam Burley
2129

Há duas maneiras de "desfazer" seu último commit, dependendo de você já ter tornado seu commit público ou não (enviado ao repositório remoto):

Como desfazer uma consolidação local

Digamos que eu confirmei localmente, mas agora quero remover esse commit.

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 de volta ao estado anterior ao último commit, precisamos resetfazer o commit antes 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 git logmostrará que nosso último commit foi removido.

Como desfazer um commit público

Se você já tornou seus commits públicos, convém criar um novo commit que "reverterá" as alterações feitas no commit anterior (HEAD atual).

git revert HEAD

Suas alterações agora serão revertidas e prontas para você confirmar:

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 obter mais informações, consulte Git Basics - Desfazendo coisas .

Andrew
fonte
101
Achei esta resposta a mais clara. git revert HEAD^não é o anterior, é o anterior do anterior. Eu fiz: git revert HEADe, em seguida, pressione novamente e funcionou :)
nacho4d
Se o Git perguntar "Mais?" ao tentar esses comandos, use a sintaxe alternativa nesta resposta: stackoverflow.com/a/14204318/823470
tar
1745

Adicione / remova arquivos para obter as coisas da maneira que você deseja:

git rm classdir
git add sourcedir

Em seguida, altere o commit:

git commit --amend

A confirmação incorreta anterior será editada para refletir o novo estado do índice - em outras palavras, será como se você nunca tivesse cometido o erro.

Observe que você só deve fazer isso se não tiver pressionado ainda. Se você pressionou, precisará apenas fazer uma correção normalmente.

bdonlan
fonte
2
FYI: Isso remove todos os meus arquivos e perdi as alterações.
egorlitvinenko
UPD: No entanto, eu restaurei usando reflog. Mas o recebimento não funcionou para o commit inicial.
egorlitvinenko
1
Use git rm --cachedpara manter os arquivos no sistema de arquivos e excluí-los apenas do índice git!
xuiqzy
1016
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

ou

git reset --hard HEAD~1

Aviso: O comando acima removerá permanentemente as modificações no .java arquivos (e quaisquer outros arquivos) que você deseja confirmar.

O hard resetto HEAD-1definirá sua cópia de trabalho para o estado do commit antes do commit errado.

Lennart Koopmann
fonte
19
git commit -a -m ""ou git commit -am ""naturalmente! :]
Trejder
Outro uso 'atalho' de esconderijo; se você quiser tudo unstage (add desfazer git), apenas git stash, entãogit stash pop
seanriordan08
778

Para alterar o último commit

Substitua os arquivos no índice:

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

Em seguida, se for um ramo privado, altere o commit:

git commit --amend

Ou, se for um ramo compartilhado, faça um novo commit:

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


( Para alterar uma confirmação anterior , use a incrível re-interação interativa .)


ProTip ™: adicione *.classa um gitignore para impedir que isso aconteça novamente.


Para reverter uma confirmação

Alterar uma confirmação é a solução ideal se você precisar alterar a última confirmação, mas uma solução mais geral é reset .

Você pode redefinir o Git para qualquer confirmação com:

git reset @~N

Onde Né o número de confirmações anteriores HEADe @~redefine para a confirmação anterior.

Portanto, em vez de alterar o commit, você pode usar:

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

Confira git help reset, especificamente as seções --soft --mixede --hard, para uma melhor compreensão do que isso faz.

Reflogar

Se você errar, sempre poderá usar o reflog para encontrar confirmações descartadas:

$ 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


Zaz
fonte
2
Para aqueles que leem no futuro - observe que git reverté um comando separado - que basicamente 'redefine' um único comentário.
precisa saber é o seguinte
682

Use git revert <commit-id>.

Para obter o ID de confirmação, basta usar git log.

Jaco Pretorius
fonte
15
O que isso significa, cereja escolhe o commit? No meu caso, eu estava no ramo errado quando editei um arquivo. Eu o cometi e percebi que estava no ramo errado. O uso de "git reset --soft HEAD ~ 1" fez com que eu voltasse antes do commit, mas agora, se eu fizer o checkout da ramificação correta, como desfazer as alterações no arquivo na ramificação errada, mas fazê-las (com o mesmo nome arquivo) no ramo correto?
Astronomerdave
Acabei de utilizar git revert commit-idfuncionou como um encanto. Obviamente, você precisará fazer as alterações.
Casey Robinson
8
Acredito que seria git cherry-pick <<erroneous-commit-sha>>@astronomerdave. De, Sr. Quase 2 Anos de Atraso no Partido.
Tom Howard
@Kris: Em vez de escolher a cereja, rebase. Porque é avançado escolher cereja
Eugen Konkov
Eu usaria revert apenas se já tiver enviado meu commit. Caso contrário, redefinir é uma opção melhor. Não esqueça que a reversão cria um novo commit, e geralmente esse não é o objetivo.
Hola Soy Edu Feliz Navidad
532

Se você está planejando desfazer um commit local completamente, o que quer que você tenha alterado no commit, e se você não se preocupa com nada, basta executar o seguinte comando.

git reset --hard HEAD^1

(Este comando ignorará todo o commit e suas alterações serão perdidas completamente da sua árvore de trabalho local). Se você deseja desfazer sua consolidação, mas deseja suas alterações na área de preparação (antes da consolidação como depois git add), execute o seguinte comando.

git reset --soft HEAD^1

Agora seus arquivos confirmados entram na área de preparação. Suponha que, se você deseja substituir os arquivos, porque precisa editar algum conteúdo errado, execute o seguinte comando

git reset HEAD

Agora, os arquivos confirmados vêm da área preparada para a não preparada. Agora, os arquivos estão prontos para edição; portanto, o que você alterar, você deseja editar e adicioná-lo e fazer um novo / novo commit.

Mais

Madhan Ayyasamy
fonte
13
@SMR, No seu exemplo, todos estão apontando apenas para o HEAD atual. CABEÇA ^ = CABEÇA ^ 1. Assim como HEAD ^ 1 = HEAD ~ 1. Quando você usa HEAD ~ 2, há uma diferença entre os símbolos ~ e ^. Se você usar ~ 2 significa "o primeiro pai do primeiro pai" ou "o avô".
Madhan Ayyasamy
501

Se você tiver o Git Extras instalado, poderá executar git undopara desfazer a confirmação mais recente. git undo 3desfaz os três últimos commits.

nickf
fonte
470

Queria desfazer os cinco últimos commits em nosso repositório compartilhado. Procurei o ID da revisão para o qual eu queria reverter. Então 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 [email protected]:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>
neoneye
fonte
25
Reescrever o histórico em um repositório compartilhado geralmente é uma péssima idéia. Suponho que você saiba o que está fazendo, só espero que os futuros leitores também.
Brad Koch
Sim, a reversão é perigosa. Verifique se a sua cópia de trabalho está no estado desejado antes de pressionar. Ao pressionar, as confirmações indesejadas são excluídas permanentemente.
neoneye
6
"Assim como no mundo real, se você deseja reescrever a história, precisa de uma conspiração: todo mundo tem que estar dentro da conspiração (pelo menos todo mundo que conhece a história, ou seja, todo mundo que já saiu do ramo) . " Fonte: stackoverflow.com/a/2046748/334451
Mikko Rantalainen
440

Eu prefiro usar git rebase -ipara este trabalho, porque uma boa lista aparece onde eu posso escolher os commits para me livrar. Pode não ser tão direto quanto outras respostas aqui, mas parece certo .

Escolha quantas confirmações você deseja listar e, em seguida, chame assim (para inscrever as últimas três)

git rebase -i HEAD~3

Lista de amostra

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

Em seguida, o Git removerá confirmações para qualquer linha que você remover.

Steven Penny
fonte
422

Como corrigir a consolidação local anterior

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

Como desfazer a consolidação local anterior

Redefina sua ramificação para o local anterior (por exemplo, usando gitkou git rebase). Em seguida, aplique novamente as alterações a partir de uma cópia salva. Após a coleta de lixo em seu repositório local, será como se o commit indesejado nunca tivesse acontecido. Para fazer tudo isso em um único comando, use git reset HEAD~1.

Aviso : O uso descuidado de git reseté uma boa maneira de colocar sua cópia de trabalho em um estado confuso. Eu recomendo que os novatos do Git evitem isso, se puderem.

Como desfazer um commit público

Execute uma seleção reversa de cereja ( git-revert ) para desfazer as alterações.

Se você ainda não inseriu outras alterações em seu ramo, pode simplesmente fazer ...

git revert --no-edit HEAD

Em seguida, envie sua ramificação atualizada para o repositório compartilhado.

O histórico de consolidação mostrará os dois commit, separadamente .


Avançado: Correção da ramificação privada no repositório público

Isso pode ser perigoso - verifique se você tem uma cópia local da ramificação para repush.

Observe também: você não deseja fazer isso se outra pessoa estiver trabalhando na ramificação.

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

Limpe sua filial localmente e repush ...

git push origin (branch_name)

No caso normal, você provavelmente não precisa se preocupar com o histórico de confirmação de ramificação particular. Basta enviar um commit de acompanhamento (consulte 'Como desfazer um commit público' acima) e, posteriormente, fazer uma mescla de squash para ocultar o histórico.

nobar
fonte
8
gitk --all $(git reflog | cut -c1-7)&pode ser útil para encontrar a revisão anterior se você quiser desfazer um commit '--amend'.
Nobar
4
Deve-se observar que, se você estiver tentando remover informações secretas antes de enviar para um repositório compartilhado, fazer uma reversão não ajudará, porque as informações ainda estarão no histórico no commit anterior. Se você quiser garantir a mudança não é visível para os outros que você precisa para usogit reset
Jherico
Eu acho que 'privado' / 'público' seria mais corretamente 'local' / 'remoto'.
Nobar
Corrigindo um ramo privado no repositório remoto também pode ser feito simplesmentegit push origin (branch_name) --force
Nobar
336

Se você deseja desfazê-lo permanentemente e clonou algum repositório

O ID de confirmação pode ser visto por

git log 

Então você pode fazer -

git reset --hard <commit_id>

git push origin <branch_name> -f
pobres
fonte
E se você não usar "<commit_id>" e simplesmente usar "git reset --hard"? Normalmente, só quero me livrar das minhas atualizações mais recentes que ainda não foram confirmadas e voltei para as mais recentes que fiz e sempre uso o "git reset --hard".
Jaime Montoya
3
@JaimeMontoya Para desfazer as últimas alterações que você pode usar git reset --hard, mas se você tem que remover duro últimos "n" commits você especificar um SHA
Poorva
334

Se você cometeu lixo, mas não empurrou,

git reset --soft HEAD~1

HEAD ~ 1 é uma abreviação para o commit antes do head. Como alternativa, você pode consultar o SHA-1 do hash se desejar redefinir para. A opção --soft excluirá o commit, mas deixará todos os seus arquivos alterados "Alterações a serem confirmadas", conforme o status do git.

Se você quiser se livrar de quaisquer alterações nos arquivos rastreados na árvore de trabalho desde o commit antes do head, use " --hard ".

OU

Se você já empurrou e alguém puxou, o que geralmente é o meu caso, você não pode usar git reset . No entanto, você pode fazer uma reversão do git ,

git revert HEAD

Isso criará um novo commit que reverte tudo o que foi introduzido pelo commit acidental.

santos_mgr
fonte
Estou no 2º caso, mas quando faço "git revert HEAD", ele diz "error: Commit [ID] é uma mesclagem, mas nenhuma opção -m foi dada. Fatal: revert failed". Alguma sugestão?
metaforge 12/11/14
2
Provavelmente vale a pena mencionar que, em vez de HEAD~1você, poderia usar o hash real, conforme exibido git log --statpor git reflog- útil quando você precisar 'desfazer' mais de um commit.
Ccpizza
284

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

No terminal:

Como alternativa, você pode usar:

git revert

Ou:

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 your changes.
Varun Parakh
fonte
263

Um único comando:

git reset --soft 'HEAD^' 

Funciona muito bem para desfazer o último commit local!

Manish Shrivastava
fonte
11
Eu precisava escrever git reset --soft "HEAD ^" com aspas duplas, porque escrevi no prompt de comando do Windows.
Ena
253

Basta redefini-lo usando o comando abaixo usando git:

git reset --soft HEAD~1

Explique: o que git resetfaz, é basicamente resetpara qualquer confirmação que você gostaria de voltar e, se você combiná-la com a --softchave, ela voltará, mas mantenha as alterações no (s) seu (s) arquivo (s), para voltar ao estágio qual o arquivo que acabou de ser adicionado, HEADé o chefe do ramo e, se você combinar com ~1(neste caso, você também usa HEAD^), ele retornará apenas um commit do que você deseja ...

Crio as etapas da imagem abaixo em mais detalhes para você, incluindo todas as etapas que podem ocorrer em situações reais e confirmar o código:

Como desfazer os últimos commits no Git?

Alireza
fonte
239

Como desfazer o último commit do Git?

Para restaurar tudo de volta ao estado anterior ao último commit, precisamos redefinir o commit antes do HEAD.

  1. Se você não deseja manter as alterações feitas:

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

    git reset --soft HEAD^
    

Agora verifique seu log do git. Isso mostrará que nosso último commit foi removido.

Ranjithkumar Ravi
fonte
193

"Redefinir a árvore de trabalho para o último commit"

git reset --hard HEAD^ 

"Limpe arquivos desconhecidos da árvore de trabalho"

git clean    

consulte - Referência Rápida do Git

NOTA: Este comando excluirá a confirmação anterior, portanto, use com cuidado! git reset --hardé mais seguro.

Ravi_Parmar
fonte
190

Use reflog para encontrar um estado correto

git reflog

reflog antes REFLOG ANTES DE REINICIAR

Selecione o reflog correto (f3cb6e2 no meu caso) e digite

git reset --hard f3cb6e2

Depois disso, o repo HEAD será redefinido para o HEADid efeito de redefinição LOG AFTER RESET

Finalmente, o reflog se parece com a imagem abaixo

reflog depois REFLOG FINAL

Shubham Chaudhary
fonte
164

Primeira corrida:

git reflog

Ele mostrará todas as ações possíveis que você executou no seu repositório, por exemplo, confirmar, mesclar, puxar, etc.

Então faça:

git reset --hard ActionIdFromRefLog
U. Ali
fonte
155

Desfazer a última confirmação:

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

Isso desfará o último commit.

Aqui --softsignifica redefinir a preparação.

HEAD~ou HEAD^significa mudar para confirmar antes de HEAD.


Substitua a última confirmação por nova confirmação:

git commit --amend -m "message"

Ele substituirá o último commit pelo novo commit.

akshay_rahar
fonte
153

Outra maneira:

Faça o checkout da filial que você deseja reverter e, em seguida, redefina sua cópia de trabalho local de volta para a confirmação de que você deseja ser a mais recente no servidor remoto (tudo depois que ela se despedir). Para fazer isso, no SourceTree, clique com o botão direito do mouse e selecione "Redefinir BRANCHNAME para este commit".

Em seguida, navegue até o diretório local do seu repositório e execute este comando:

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

Isso apagará todas as confirmações após a atual em seu repositório local, mas apenas para essa ramificação.

CommaToast
fonte
144

Digite git loge localize o último código hash de confirmação e digite:

git reset <the previous co>
Peter Mortensen
fonte
139

No meu caso, cometi acidentalmente alguns arquivos que 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

Verifique os resultados com gitk ou git log --stat

egridasov
fonte
133

Simples, execute isso na sua linha de comando:

git reset --soft HEAD~ 
ihue
fonte
126

Há muitas maneiras de fazer isso:

Comando Git para desfazer a última confirmação / confirmação anterior:

Aviso: Não use --hard se você não souber o que está fazendo. --hard é muito perigoso e pode excluir seus arquivos.

O comando básico para reverter a confirmação no Git é:

$ git reset --hard <COMMIT -ID>

ou

$ git reset --hard HEAD~<n>

COMMIT-ID : ID do commit

n: é o número das últimas confirmações que você deseja reverter

Você pode obter o ID de confirmação, como mostrado abaixo:

$ **git log --oneline**

d81d3f1 function to subtract two numbers

be20eb8 function to add two numbers

bedgfgg function to mulitply two numbers

onde d81d3f1 e be20eb8 são id de confirmação.

Agora vamos ver alguns casos:

Suponha que você queira reverter o último commit 'd81d3f1'. Aqui estão duas opções:

$ git reset --hard d81d3f1

ou

$ git reset --hard HEAD~1

Suponha que você queira reverter o commit 'be20eb8':

$ git reset --hard be20eb8

Para informações mais detalhadas, você pode consultar e experimentar outros comandos também para redefinir a cabeça para um estado especificado:

$ git reset --help
user3799762
fonte
5
git reset --hard HEAD~1é muito perigoso ! Isso não apenas 'cancelará a última confirmação', mas reverterá completamente o repo para a confirmação anterior. Então você perderá todas as alterações confirmadas na última confirmação!
Arnis Juraga 21/03
Você direita, para desfazer isso, você pode usargit push -f <remote> HEAD@{1}:<branch>
Benny
Infelizmente, eu uso --hard, e meus arquivos são excluídos! Não verifiquei o comentário primeiro porque ele foi recolhido. Não use --hard se você não sabe o que está fazendo!
anónimo
125

Para uma confirmação local

git reset --soft HEAD~1

ou se você não se lembrar exatamente em qual commit está, poderá usar

git rm --cached <file>

Para uma confirmação por push

A maneira correta de remover arquivos do histórico do repositório está usando git filter-branch. Isso é,

git filter-branch --index-filter 'git rm --cached <file>' HEAD

Mas eu recomendo que você use esse comando com cuidado. Leia mais na página de manual do git-filter-branch (1) .

geoom
fonte
125

Existem dois cenários principais

Você ainda não enviou o commit

Se o problema foi com arquivos extras que você enviou (e não os deseja no repositório), é possível removê-los usando git rme, em seguida, confirmando com--amend

git rm <pathToFile>

Você também pode remover diretórios inteiros -rou até mesmo combinar com outros comandos do Bash

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

Após remover os arquivos, você pode confirmar, com a opção --amend

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

Isso reescreverá sua confirmação local recente, removendo os arquivos extras. Portanto, esses arquivos nunca serão enviados por push e também serão removidos do GC pelo repositório local .git.

Você já enviou o commit

Você pode aplicar a mesma solução do outro cenário e seguir git pushcom a -fopção, mas não é recomendado pois sobrescreve o histórico remoto com uma alteração divergente (pode atrapalhar o seu repositório).

Em vez disso, você precisa fazer o commit sem --amend(lembre-se disso sobre -amend`: Essa opção reescreve o histórico no último commit).

dseminara
fonte
125

Para redefinir a revisão anterior, excluindo permanentemente todas as alterações não confirmadas:

git reset --hard HEAD~1
estrela
fonte
23
Talvez você possa, em uma nota / aviso, que o comando dele jogue fora o commit e as alterações no diretório de trabalho sem pedir mais nada.
cr7pt0gr4ph7
13
Use --softpara manter suas alterações como uncommitted changes, --hardpara remover completamente o commit e reverter um por um. Lembre-se de executar essas operações apenas em alterações que ainda não foram enviadas.
Yunus Nedim Mehel
@Zaz: Você está certo; talvez eu devesse ter esclarecido isso. Somente arquivos / alterações que foram adicionados ao índice (/ testado) ou confirmados podem ser recuperados. Alterações não confirmadas e sem etapas são , como você disse, completamente descartadas git reset --hard.
Cr7pt0gr4ph7
1
Como nota lateral: sempre que um arquivo é preparado, ele gitarmazena seu conteúdo no banco de dados de objetos. O conteúdo armazenado é removido apenas quando a coleta de lixo é executada. Portanto, é possível recuperar a última versão em estágios de um arquivo que não estava atualmente em estágios quando git reset --hardfoi executado (consulte as postagens vinculadas acima para obter mais informações).
Cr7pt0gr4ph7 13/09/16