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

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



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


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


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.


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.


47

Basta digitar no console:

$ git reset HEAD~

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


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


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 *


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

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

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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.