Como faço para desfazer os commits mais recentes no Git?


14 Answers

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

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

   (F)
A-B-C
    ↑
  master

Você quer nuke commit C e nunca mais vê-lo novamente . Você faz isso:

git reset --hard HEAD~1

O resultado é:

 (F)
A-B
  ↑
master

Agora B é a cabeça. Porque você usou --hard , seus arquivos são redefinidos para seu estado no commit B.

Ah, mas suponha que comprometer C não fosse um desastre, mas apenas um pouco fora. Você deseja desfazer o commit, mas mantenha as alterações para um pouco de edição antes de fazer um commit melhor. Começando de novo daqui, com C como sua CABEÇA:

   (F)
A-B-C
    ↑
  master

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

git reset HEAD~1

Neste caso, o resultado é:

   (F)
A-B-C
  ↑
master

Em ambos os casos, HEAD é apenas um ponteiro para o commit mais recente. Quando você faz um git reset HEAD~1 , você diz ao Git para mover o ponteiro HEAD para trás um commit. Mas (a menos que você use --hard ) você deixa seus arquivos como estavam. Então agora o git status mostra as mudanças que você registrou no C. Você não perdeu nada!

Para o toque mais leve, você pode até mesmo desfazer seu commit, mas deixar seus arquivos e seu index :

git reset --soft HEAD~1

Isso não apenas deixa seus arquivos em paz, como também deixa seu índice sozinho. Quando você faz o git status , você verá que os mesmos arquivos estão no índice como antes. De fato, logo após este comando, você poderia fazer git commit e você estaria refazendo o mesmo commit que você acabou de fazer.

Mais uma coisa: suponha que você destrua um commit como no primeiro exemplo, mas depois descobre que precisava disso depois de tudo ? Sorte, certo?

Não, ainda há uma maneira de recuperá-lo. Digite git reflog e você verá uma lista de commits (parciais) shas pelos quais você se mudou. Encontre o commit que você destruiu, e faça o seguinte:

git checkout -b someNewBranchName shaYouDestroyed

Você agora ressuscitou esse commit. Compromissos não são realmente destruídos no Git por cerca de 90 dias, então você geralmente pode voltar e resgatar um que você não queria se livrar.

Question

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

Como posso desfazer esses commits do repositório local?




Simples, execute isso na sua linha de comando:

 git reset --soft HEAD~ 



Se você quiser remover arquivos no último commit, você pode usar isto:

git reset --soft HEAD~ 

E se precisar de arquivos no último commit, você pode usar isto:

git reset --hard HEAD~1



Se você quiser desfazê-lo permanentemente e clonar algum repositório

O ID de commit pode ser visto por

git log 

Então você pode fazer

git reset --hard <commit_id>

git push origin <branch_name> -f



Para alterar o último commit

Substitua os arquivos no índice:

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

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

git commit --amend

Ou, se for uma ramificação compartilhada, faça um novo commit:

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


( para mudar um commit anterior , use o awesome rebase interativo )

ProTip ™: Adicione *.class a um gitignore para impedir que isso aconteça novamente.

Para reverter um commit

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

Você pode resetar o git para qualquer commit com:

git reset @~N

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

Então, em vez de alterar o commit, você poderia usar:

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

Confira a git help reset , especificamente as seções em --soft --mixed e --hard , para entender melhor o que isso faz.

Reflog

Se você errar, você sempre pode usar o reflog para encontrar commits descartados:

$ 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





Digite git log e encontre o último código hash de commit e então digite:

git reset <the previous co>



"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 irá deletar seu commit anterior, então use com cuidado! git reset --hard é mais seguro -




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




Um único comando:

git reset --soft 'HEAD^' 

Funciona muito bem para desfazer o último commit local!




Se você está planejando desfazer um commit local inteiramente, o que quer que você tenha alterado no commit, e se você não se preocupa com isso, apenas faça o seguinte comando.

git reset --hard HEAD^1

(Este comando irá ignorar todo o seu commit e suas alterações serão perdidas completamente da sua árvore de trabalho local). Se você deseja desfazer sua confirmação, mas deseja suas alterações na área temporária (antes de confirmar como após o git add ), faça o seguinte comando.

git reset --soft HEAD^1

Agora seus arquivos comprometidos entram na área de preparação. Suponha que, se você quiser usar os arquivos, porque precisa editar algum conteúdo errado, faça o seguinte comando

git reset HEAD

Arquivos agora comprometidos para vir da área preparada para a área sem estágio. Agora os arquivos estão prontos para edição, então o que quer que você mude, você quer ir editá-lo e adicioná-lo e fazer um novo / novo commit.

More




Como corrigir o commit local anterior

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

Como desfazer o commit local anterior

Basta redefinir sua ramificação para o local anterior (por exemplo, usando gitk ou git rebase ). Em seguida, reaplique suas 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 .

Palavra de aviso : O uso descuidado do git reset é uma boa maneira de deixar 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 fez outras alterações no seu ramo, você pode simplesmente ...

git revert --no-edit HEAD

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

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

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

Isso pode ser perigoso - certifique-se de ter uma cópia local do ramo para repassar.

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

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

Limpe o seu ramo localmente e depois repila ...

git push origin (branch_name)

No caso normal, você provavelmente não precisa se preocupar com o histórico de commits de ramificação privada sendo intocado. Basta apertar um commitup de acompanhamento (veja 'Como desfazer um commit público' acima), e depois, faça um squash-merge para esconder o histórico.




Outra maneira:

Faça check-out da ramificação que você deseja reverter e redefina sua cópia de trabalho local de volta para o commit que você deseja que seja a mais recente no servidor remoto (tudo depois que ele for bye-bye). Para fazer isso, no SourceTree eu cliquei com o botão direito do mouse e selecionei "Reset BRANCHNAME to this 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á todos os commits após o atual em seu repositório local, mas apenas para aquele branch.




Como desfazer o último commit do Git?

Para restaurar tudo de volta ao modo como estava antes do último commit, precisamos redefinir para o commit antes do HEAD.

  1. Se você não quiser manter suas alterações feitas:

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

    git reset --soft HEAD^
    

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




Eu queria desfazer os últimos 5 commits em nosso repositório compartilhado. Eu olhei para o id de revisão que 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>



Adicionar / remover arquivos para fazer as coisas do jeito que você deseja:

git rm classdir
git add sourcedir

Em seguida, altere o commit:

git commit --amend

O commit anterior, errôneo, será editado para refletir o novo estado do índice - em outras palavras, será como se você nunca tivesse cometido o erro em primeiro lugar.

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




Related