Como excluir o último n commit no Github e localmente?

127

Estou tentando excluir os 2 últimos commits de um dos meus repositórios do GitHub. Eu tentei como sugerido aqui : git push -f origin HEAD^^:master. Parece que funciona, pois os dois últimos commits são removidos.

Em seguida, eu os excluí do meu repositório local com git rebase -i HEAD~2. Eu removo as linhas relacionadas a essas confirmações e verifico se git logelas foram removidas corretamente.

Depois disso, faço algumas alterações no meu repositório local, faço um novo commit e envio ao GitHub. O problema é que, na minha conta do GitHub, tenho os dois commits anteriores que tentei excluir.

Eu acho que o problema está no meu repositório local, porque se eu clonar meu repositório Github no meu local e fazer algumas alterações aqui, quando eu envio um novo commit, esses commit antigos não são enviados para o GitHub.

Qualquer ideia?

Ivan Fernandez
fonte

Respostas:

199

Para remover os dois últimos commits localmente, sugiro usar:

git reset --hard HEAD^^

Rebase é uma operação completamente diferente que não o ajudará aqui.

KL-7
fonte
23
Se você já enviou essa alteração para um repositório remoto. Você pode removê-lo com -f git push
Ivan Fernandez
Você pode generalizar isso para o último n número de confirmações?
user_19
6
@ user_19 você pode fazer coisas como git reset --hard HEAD^4ou git reset --hard HEAD~4. No entanto, as coisas podem ficar um pouco complicadas se o seu histórico contiver mesclagens. Você pode encontrar mais informações sobre como especificar revisões na seção correspondente aqui .
KL-7
2
Se eu quisesse excluir os últimos 7 commits então ?? Preciso colocar 7 vezes ^ após CABEÇA ... por favor limpar-me
Gagan Gami
4
@GaganGami, acho que você faria git reset --hard HEAD~7, mas por favor me corrija se eu estiver errado.
Con Antonakos
105

Se você deseja remover as 2 (duas) últimas confirmações, existe um comando fácil para fazer isso:

git reset --hard HEAD~2

Você pode alterar o 2número de últimas confirmações que deseja remover.

E para enviar essa alteração para remoto, você precisa fazer um git pushcom o parâmetro force ( -f):

git push -f

No entanto, não recomendo executar nenhum gitcomando -fou --hardopção envolvida se houver novas confirmações no remoto (Github) após a confirmação que você deseja remover. Nesse caso, sempre use git revert.

Dherik
fonte
As alterações que eu fiz permanecem?
Zuhayer Tahir
@SymfonyUser, não. Quando você fez o hardcomando, você perde esses dois commits. Se você deseja salvar as alterações, crie um diffarquivo dessas confirmações antes de aplicar a redefinição.
Dherik
3
@ZuhayerTahir se você quiser desfazer a confirmação das últimas 5 confirmações, basta fazer git reset HEAD~5(não use hard). Dessa forma, você obterá suas alterações em um estado intermediário (ou seja, não confirmado). Para mim, veja esta resposta .
Mel
@ Mel Obrigado por sua resposta. Eu cheguei à mesma conclusão.
Zuhayer Tahir 13/11/19
29

O seguinte funciona para mim

git reset HEAD~n

Ele remove as últimas nconfirmações do repositório local, assim como HEAD^remove apenas uma. Se você precisar remover essas alterações do controle remoto, poderá ser necessário forçar o envio, pois estará atrás do controle remoto.

git push -f origin <branch>
Sial01
fonte