Reinicialização do controle remoto para um determinado compromisso

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>

Solução

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 
 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.

Comentários (12)

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:

  1. Faça **não*** fazer qualquer reinicialização.

    1. Use 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).
  2. Copie o hash.

  3. Execute um comando como:

     git push --force  :

    por exemplo

     git push --force origem 606fdfaa33af1844c86f4267a136d4666e576cdc:master
Comentários (11)

Eu resolvi um problema como o seu por este comando:

git reset --hard  
git push -f  : 
Comentários (0)