Eu quero descartar todas as alterações feitas depois de cometer <commit-hash>
.
Então eu fiz:
git reset --hard <commit-hash>
Agora eu quero fazer o mesmo com o meu comando. Como é que eu posso fazer isto? Eu fiz alguns commits (e empurrões) depois de <commit-hash>
e eu só quero descartar todos eles. É que alguma coisa correu terrivelmente mal no caminho e eu não'não quero piorar as coisas do que já está ;(
Eu basicamente quero rebobinar a minha "origem/master" para <commit-hash>
Assumindo que sua filial é chamada de "mestre" tanto aqui como remotamente, e que seu controle remoto é chamado de "origem", você poderia fazer:
git reset --hard <commit-hash>
git push -f origin master
No entanto, você deve evitar fazer isso se alguém mais estiver trabalhando com seu repositório remoto e tiver puxado suas alterações. Nesse caso, seria melhor reverter os commits que você não quer't, e depois empurrar como normal.
Update: you've explained below that other people have pulled the changes that you've pushed, so it's better to create a new commit that reverts all of those changes. Aí's uma boa explicação das suas opções para fazer isso em [esta resposta de Jakub https://stackoverflow.com/questions/1463340/revert-multiple-git-commits/1470452#1470452](Narębski). Qual delas é mais conveniente depende de quantos commits você quer reverter, e qual método faz mais sentido para você.
Como a partir da sua pergunta é claro que você já utilizou git reset --hard
para resetar seu ramo master
, você pode precisar começar utilizando git reset --hard ORIG_HEAD
para mover seu ramo de volta para onde ele estava antes. (Como sempre com git reset --hard
, certifique-se que o git status
está limpo, que você'está no ramo certo e que você'está ciente do git reflog
como uma ferramenta para recuperar commits aparentemente perdidos). Você também deve verificar que ORIG_HEAD
aponta para o commit certo, com git show ORIG_HEAD
.
Resolução de problemas:
Se você receber uma mensagem como "! [remoto rejeitado] a60f7d85 -> master (gancho de pré-recepção recusado)"
então você tem que permitir a reescrita do histórico da filial para a filial específica. Em BitBucket, por exemplo, dizia " não é permitido reescrever o histórico do ramo". Há uma caixa de seleção chamada 'Allow rewriting branch history' que você tem que checar.
Use as outras respostas se você não'não se importa de perder as mudanças locais. Este método ainda pode estragar seu controle remoto se você escolher o hash errado para voltar.
Se você só quer fazer a correspondência remota um compromisso que's já na sua filial local:
Faça **não*** fazer qualquer reinicialização.
git log
para encontrar o hash do commit que você quer que o controle remoto esteja. Use git log -p
para ver mudanças, ou `git log --graph --all --oneline --decorate' para ver uma árvore compacta. (Ter essa última como um apelido na sua shell é muito útil).Copie o hash.
Execute um comando como:
git push --force <remote> <the-hash>:<the remote branch>
por exemplo
git push --force origem 606fdfaa33af1844c86f4267a136d4666e576cdc:master