Remova uma confirmação git que não foi enviada por push

724

Eu fiz um, git commitmas ainda não o enviei para o repositório. Então, quando eu faço git status, recebo '# Seu ramo está à frente de' mestre 'por 1 commit.

Portanto, se eu quiser reverter meu commit principal, posso fazer:

git reset --hard eb27bf26dd18c5a34e0e82b929e0d74cfcaab316

dado que quando git logrecebo:

confirmar eb27bf26dd18c5a34e0e82b929e0d74cfcaab316
Data: Terça, 29 de setembro, 11:21:41 2009 -0700


confirmar db0c078d5286b837532ff5e276dcf91885df2296
Data: Terça, 22 de setembro, 10:31:37 2009 -0700
hap497
fonte
9
Esta questão parece ser um duplicado de outra de suas próprias perguntas: stackoverflow.com/questions/1338728/how-to-delete-a-git-commit
Brian Campbell
1
Possível duplicado de commits DELETE FROM uma filial na Git
Leonardo Alves Machado
1
Possível duplicata de Como desfazer as últimas confirmações no Git?
Jan Zerebecki
3
PERIGO: reset --hardpode resultar em perda de trabalho, porque isso resulta em git substituindo seus arquivos locais (seu novo trabalho) pelos da web (aconteceu comigo). Perguntas e respostas sobre o git devem declarar explicitamente o que seus comandos estão fazendo e quais são os riscos para os leitores seguintes.
OrangeSherbet

Respostas:

673

Na verdade, quando você usa git reset, você deve consultar a cometer que você está redefinindo a ; então você deseja o db0c078commit, provavelmente.

Uma versão mais fácil seria git reset --hard HEAD^redefinir o commit anterior antes do cabeçalho atual; Dessa forma, você não precisa copiar os IDs de confirmação.

Cuidado ao fazer alguma coisa git reset --hard, pois você pode perder as alterações não confirmadas que tiver. Convém verificar git statusse a sua cópia de trabalho está limpa ou se você deseja eliminar as alterações existentes.

Além disso, em vez de HEAD, você pode usar origin/mastercomo referência, conforme sugerido por @bdonlan nos comentários:git reset --hard origin/master

Brian Campbell
fonte
374
Ou git reset --hard origin/master, para redefini-lo para qualquer que seja a origem.
bdonlan
1
Outro ponteiro útil para o qual você pode redefinir é ORIG_HEAD ou sua generalização utilizando o reflog HEAD @ {1} (a última posição de HEAD).
Jakub Narębski 23/10/09
12
Leitor, antes de você git resetseu código. Faça o seu próprio futuro a favor: A diferença entre reset, reset --softe reset --hard(o que acontece com a sua anterior git addaka "o seu trabalho" :) Imagem: ligação
user18099
3
Observe que isso excluirá o que estava no commit que você deseja remover (portanto, um git statusnão mostrará alterações e o commit será removido / alterações perdidas).
Bjørn Børresen
12
NOTA: Tenha cuidado ao usar, git reset --hard HEAD^pois você perderá alterações nos arquivos confirmados (as alterações serão excluídas). Existem dois ramos a esta pergunta: Para reverter a cometer, mas ainda tem mudanças no disco fazê-logit reset --soft HEAD~1
papigee
625

SE você NÃO enviou as alterações para o controle remoto

git reset HEAD~1

Verifique se a cópia de trabalho está limpa git status.

ELSE você enviou suas alterações para controle remoto

git revert HEAD

Este comando reverterá / removerá o último commit / change e você poderá pressionar

Jeril Kuruvila
fonte
34
Este respostas para "Remover o último git commit que não tenha sido empurrado" (mais próximo resposta IMHO)
Pierre de LESPINAY
25
Além disso, mantém as alterações locais feitas no último commit, enquanto o git reset --hard não
Stanimir Stoyanov
1
para mim, ele irá desfazer a última empurrado cometer e unpushed comprometer
CodyChan
O git revert HEAD para mim acabou de excluir todos os arquivos que eu estava pronto para enviar. Seja cuidadoso!
Jason Bruce
159
git reset --hard origin/master

para redefini-lo para qualquer que seja a origem.

Isso foi postado por @bdonlan nos comentários . Eu adicionei esta resposta para pessoas que não lêem comentários.

Shadoweb
fonte
4
Esta pergunta foi feita há quase 5 anos e isso já está em um dos comentários.
Anubian Noob
1
E se a ramificação local atual for diferente master- devo usar origin/mybranchentão?
Pavel Vlasov
9
Normalmente, não leio os comentários quando estou com pressa por uma resposta ... Obrigado por colocar como resposta (uma simples que funcione) #
Leonardo Alves Machado
Aviso: esteja ciente de que isso removerá todas as alterações de código existentes, exceto as git reset HEAD~que apenas devolvem a confirmação ao código
Mayer Spitzer
70

Existem duas ramificações para esta pergunta (reverter uma confirmação não significa que eu quero perder todas as minhas alterações locais):

1. Para reverter as últimas confirmações e descartar as alterações no arquivo confirmado, faça:

git reset --hard HEAD~1

2. Para reverter a confirmação mais recente, mas manter as alterações locais (em disco), faça:

git reset --soft HEAD~1

Este (o comando posterior) o levará ao estado que você estaria se o fizesse git add.

Se você quiser desestabilizar os arquivos depois disso, faça

git reset

Agora você pode fazer mais alterações antes de adicionar e confirmar novamente.

papigee
fonte
47

Basta digitar no console:

$ git reset HEAD~

Este comando descarta todas as confirmações locais antes do HEAD remoto

marcdahan
fonte
7
Você pode explicar o que sua resposta acrescenta sobre as respostas existentes?
Nvoigt # 4/18
Isso limpa a atual comprometer antes de empurrar - sem reverter alterações feitas localmente - como as outras respostas - o que poderia ser um grave momento cabelo cama
Grant
43

Eu acredito que um deles irá atender a sua necessidade

1 - Desfaça a confirmação e mantenha todos os arquivos organizados: git reset --soft HEAD~;

2 - Desfazer confirmar e desestabilizar todos os arquivos: git reset HEAD~;

3 - Desfaça a confirmação e remova completamente todas as alterações: git reset --hard HEAD~;

aqui é onde encontrei a resposta

M. Massula
fonte
Esta resposta deve ser aceita: D
Aaron John Sabu
30

Remova a última confirmação antes do envio

git reset --soft HEAD~1

1significa a última confirmação, se você deseja remover dois últimos usos 2e assim por diante *

Karina Haddad
fonte
3
Olá Karina, a menção de --softé um ótimo complemento para as respostas possíveis, mas você também pode mencionar o porquê? Explicar sua solução é sempre útil. Tente também ficar com o inglês. Obrigado
Vlastimil Ovčáčík
1
--soft- garante que você não perca alterações no arquivo cujo commit você está tentando desfazer
papigee
19

Eu experimentei a mesma situação que fiz abaixo, muito mais fácil. Ao passar, commit-Idvocê pode acessar o commit específico que deseja ir:

git reset --hard {commit-id}

Como você deseja remover seu último commit, você precisa passar para commit-Idonde você precisa mover o ponteiro:

git reset --hard db0c078d5286b837532ff5e276dcf91885df2296
Kamlesh Patidar
fonte
Apenas um aviso para iniciantes como eu - faça backup de todos os arquivos em que você deseja MANTER as alterações, pois elas serão revertidas para a versão anterior. Meu cenário era que acidentalmente coloquei um despejo de banco de dados no diretório de repositório e depois confirmei - obviamente não queria confirmar esses arquivos no repositório, mas o DID queria manter as alterações feitas em outros arquivos. Então eu tive que copiar e colar as alterações necessárias no backup que fiz antes de fazer o git reset.
User1063287
10

Isto é o que eu faço:

Primeiro faça o checkout de sua filial (para minha masterfilial do caso ):

git checkout master

Em seguida, redefina para HEAD remoto ( ele removerá todas as alterações locais ), force a limpeza e puxe:

git reset HEAD^ --hard && git clean -df && git pull
Adnan
fonte
1
É uma opção muito nuclear. Eu sugeriria redefinição suave para commit limitado.
c0der512 3/03
3

Uma maneira seria excluir a filial local e fazer check-out dessa filial do servidor se a filial local estiver à frente do controle remoto por várias confirmações e você precisar descomprimir todas elas.

saga123
fonte
resposta brilhante - permite fácil clique nele em sourcetree :)
Kamil Kiełczewski
1

Eu apenas tive o mesmo problema e acabei fazendo:

git rebase -i HEAD~N

(N é o número de confirmações que o git mostrará)

Isso solicita ao seu editor de texto e você pode remover a confirmação que deseja, excluindo a linha associada a ele.

MrCas
fonte