Aqui está o que eu fiz no meu ramo supostamente estável ...
% git rebase master
First, rewinding head to replay your work on top of it...
Fast-forwarded alpha-0.3.0 to master.
% git status
# On branch alpha-0.3.0
# Your branch is ahead of 'origin/alpha-0.3.0' by 53 commits.
#
nothing to commit (working directory clean)
% git push
Fetching remote heads...
refs/
refs/heads/
refs/tags/
refs/remotes/
'refs/heads/master': up-to-date
updating 'refs/heads/alpha-0.3.0'
from cc4b63bebb6e6dd04407f8788938244b78c50285
to 83c9191dea88d146400853af5eb7555f252001b0
done
'refs/heads/unstable': up-to-date
Updating remote server info
Isso foi tudo um erro, como eu percebi mais tarde. Gostaria de desfazer todo esse processo e reverter o ramo alpha-0.3.0 de volta ao que era.
O que devo fazer?
Respostas:
Você precisa garantir que nenhum outro usuário deste repositório esteja buscando as alterações incorretas ou tentando construir sobre as confirmações que você deseja remover porque está prestes a retroceder o histórico.
Então você precisa 'forçar' empurrar a referência antiga.
ou no seu caso
Você pode ter
receive.denyNonFastForwards
definido no repositório remoto. Se for esse o caso, você receberá um erro que inclui a frase[remote rejected]
.Nesse cenário, você precisará excluir e recriar a ramificação.
Se isso não funcionar - talvez porque você tenha
receive.denyDeletes
definido, é necessário ter acesso direto ao repositório. No repositório remoto, você deve executar algo como o seguinte comando de encanamento.fonte
git push -f origin last_known_good_commit:branch_name
Eu acredito que você também pode fazer isso:
Isso é muito semelhante ao último método, exceto que você não precisa se preocupar com o repo remoto.
fonte
--hard
parâmetro " ") deve ser o ID de qualquer confirmação que você deseja redefinir para sua ramificação.git reset --hard [commit_id]
isso, para não mexermos no continuum espaço-tempo.+
força o envio, da mesma forma que-f
(mas um pouco diferente: stackoverflow.com/a/25937833/1757149 ). Sem ele, se você tentargit push origin alpha-0.3.0
o impulso irá falhar:Updates were rejected because the tip of your current branch is behind
.git revert
é menos perigoso do que algumas das abordagens sugeridas aqui:Substitua 35f6af6f77f116ef922e3d75bc80a4a466f92650 por seu próprio commit.
fonte
A solução aceita (do @charles bailey) é altamente perigosa se você estiver trabalhando em um repositório compartilhado.
Como prática recomendada, todas as confirmações enviadas para um repositório remoto compartilhado devem ser consideradas "imutáveis". Use 'git revert': http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#fixing-mistakes
https://git-scm.com/book/be/v2/Git-Basics-Undoing-Things
fonte
Uma maneira de fazer isso sem perder as alterações desejadas:
Depois, você pode escolher os arquivos que deseja enviar
fonte
Outra maneira de fazer isso:
git push origin --delete <branch_name>
)fonte
Isso reverterá seu repo para o número de confirmação mencionado
fonte
Desfazer várias confirmações git reset --hard 0ad5a7a6 (Apenas forneça o hash SHA1 de confirmação)
Desfazer a última confirmação
git reset --hard HEAD ~ 1 (as alterações no último commit serão removidas) git reset --soft HEAD ~ 1 (as alterações no último commit estarão disponíveis como modificações locais não confirmadas)
fonte
Cenário 1 : Se você deseja desfazer a última confirmação, diga 8123b7e04b3, abaixo está o comando (isso funcionou para mim):
A saída se parece abaixo:
Informações adicionais: Cenário 2 : Em algumas situações, você pode querer reverter o que acabou de desfazer (basicamente desfaz o desfazer) através do comando anterior e, em seguida, use o comando abaixo:
Resultado:
Mais informações aqui: https://github.com/blog/2019-how-to-undo-almost-anything-with-git
fonte
As respostas existentes são boas e corretas, no entanto, e se você precisar desfazer o
push
mas:Use este comando para reverter a alteração para ref:
fonte
Se você deseja ignorar o último commit que você acabou de enviar na ramificação remota: isso não remove o commit, mas apenas o ignora movendo o ponteiro git para o commit anteriormente, referido por HEAD ^ ou HEAD ^ 1
Mas se você já enviou esse commit e outros já fizeram o branch. Nesse caso, reescrever o histórico de sua ramificação é indesejável e você deve reverter esse commit:
fonte