Como cancelar a confirmação da última confirmação não enviada por push do git sem perder as alterações

540

Existe uma maneira de reverter uma confirmação para que minha cópia local mantenha as alterações feitas nessa confirmação, mas elas se tornem alterações não confirmadas na minha cópia de trabalho? A reversão de uma confirmação leva você à confirmação anterior - quero manter as alterações feitas, mas as comprometi na ramificação errada.

Isso não foi enviado, apenas confirmado.

Mr. Boy
fonte
2
possível duplicata de Você pode explicar o que "git reset" faz em inglês simples?
precisa saber é o seguinte
6
git reset --softe git reset --mixedtanto fazer isso (um pouco diferente), ver git-reset
Torek

Respostas:

931

Existem várias maneiras de fazer isso, por exemplo:

caso você não tenha enviado o commit publicamente ainda:

git reset HEAD~1 --soft   

É isso aí, suas alterações de confirmação estarão no seu diretório de trabalho, enquanto que a ÚLTIMA confirmação será removida do seu ramo atual. Veja git reset man


Caso você tenha pressionado publicamente (em um ramo chamado 'master'):

git checkout -b MyCommit //save your commit in a separate branch just in case (so you don't have to dig it from reflog in case you screw up :) )

reverter confirmar normalmente e empurre

git checkout master
git revert a8172f36 #hash of the commit you want to destroy
# this introduces a new commit (say, it's hash is 86b48ba) which removes changes, introduced in the commit in question (but those changes are still visible in the history)
git push origin master

agora, se você deseja fazer essas alterações conforme as alterações locais em sua cópia de trabalho ("para que sua cópia local mantenha as alterações feitas nessa confirmação") - basta reverter a confirmação de reversão com a --no-commitopção:

git revert --no-commit 86b48ba (hash of the revert commit).

Criei um pequeno exemplo: https://github.com/Isantipov/git-revert/commits/master

Isantipov
fonte
5
muito obrigado, no meu caso, eu tinha dois commits que queria cancelar, e executar 'git reset HEAD ~ 1 --soft' duas vezes seguidas me levou para onde eu precisava estar.
precisa saber é o seguinte
2
para adicionar um pouco de clareza, se você não estiver usando a CLI, o primeiro resetcomando mencionado é dizer "suavemente" redefinir para 1 rev antes da cabeça, o que preserva todas as alterações locais. isso não foi imediatamente evidente para mim no SourceTree. apenas certifique-se de que você está redefinição suave ao rev anterior, não o rev você está tentando redefinir
Jon B
1
Tentei a abordagem "já empurrada" e não funciona para mim, com o git 2.14.1: diz "Already up to date"ao fazer a mesclagem.
Fabio A.
1
@FabioA. , Atualizei a resposta com uma versão funcional. Obrigado por perceber isso!
Isantipov
1
Isso não funciona. Eu pulei reset e commit e só fiz o git reverter e empurrar para fora ... agora talvez as mudanças ainda não tenham certeza ... felizmente fiz um backup da maneira mais fácil, espero que ainda funcione;) caso contrário, pode copiar as alterações desse .
Skybuck Flying
13

Se você pressionou as alterações, poderá undofazê-lo e mover os arquivos de volta ao estágio sem usar outra ramificação.

git show HEAD > patch
git revert HEAD
git apply patch

Ele criará um arquivo de patch que contém as últimas alterações de ramificação. Em seguida, reverta as alterações. E, finalmente, aplique os arquivos de correção na árvore de trabalho.

Aminadav Glickshtein
fonte
você pode querer rm patchtambém
Max Coplan 30/03
6

Para o caso: "Isso não foi enviado, apenas confirmado ". - se você usa o IntelliJ (ou outro IDE JetBrains) e ainda não efetuou alterações, pode fazer a seguir.

  1. Vá para a janela de controle de versão ( Alt + 9 / Command + 9 ) - guia "Log".
  2. Clique com o botão direito do mouse em um commit antes do seu último.
  3. Redefinir ramificação atual para aqui
  4. escolha Suave (!!!)
  5. pressione o botão Redefinir na parte inferior da janela da caixa de diálogo.

Feito.

Isso irá "descomprimir" suas alterações e retornar seu status de git ao ponto anterior ao seu último commit local. Você não perderá nenhuma alteração feita.

Eduard Streltsov
fonte
2
Adoro aprender o jeito JetBrains, obrigado! Isso é equivalente ao git reset --soft "HEAD^"Windows, aliás. :)
payne 19/04
3

Comigo, isso acontece principalmente quando pressiono as alterações no ramo errado e percebo mais tarde. E seguir os trabalhos na maioria das vezes.

git revert commit-hash
git push

git checkout my-other-branch
git revert revert-commit-hash
git push
  1. reverter a confirmação
  2. (criar e) finalizar outra filial
  3. reverter o reverter
Mubashar
fonte
1
Eu testei isso. Sua abordagem também funciona se você não tiver enviado para o controle remoto. $ git revert <commit-hash> ... depois efetue o checkout em alguma outra ramificação e digite $ git revert <revert-commit-hash> (sem os pushes). Obrigado por compartilhar esta abordagem simples !!
Natalie Cottrill
2

2020 maneira simples:

git reset <commit_hash>

Confirme o hash do último commit que você deseja manter.

Xys
fonte
1

Certifique-se de fazer backup das alterações antes de executar esses comandos em uma pasta separada

git checkout branch_name

Fazer checkout em sua filial

git merge --abort

Interrompa a mesclagem

status git

Verifique o status do código após interromper a mesclagem

git reset --hard origin / branch_name

esse comando redefinirá suas alterações e alinhará seu código com o código branch_name (branch).

Mohit Singh
fonte