Respostas:
Você pode usar git revert <commit>…para todos os n commits e, em seguida, enviar como de costume, mantendo o histórico inalterado.
Ou você pode "reverter" com git reset --hard HEAD~n. Se estiver fazendo push em um repositório público ou compartilhado, você pode divergir e interromper o trabalho de outros com base em seu branch original. O Git impedirá que você faça isso, mas você pode usar git push -fpara forçar a atualização.
revertfará com que seus branches de recursos sejam tratados como "já" mesclados. Isso porque essas ramificações estão realmente sendo mescladas. Mas as mudanças foram revertidas. Solução: selecione ou reverta o commit de reversão .
reset --hardtambém faz com que os branches do recurso sejam tratados como já mesclados? Minha suposição é que não (onde revertseria).
elmarco está correto ... sua sugestão é a melhor para repositórios compartilhados / públicos (ou, pelo menos agências públicas). Se não foi compartilhado (ou você está disposto a perturbar os outros), você também pode enviar uma referência específica:
git push origin old_master:master
Ou, se houver um commit SHA1 específico (digamos 1e4f99e na forma abreviada) para o qual você gostaria de voltar:
git push origin 1e4f99e:master
Felizmente, eu estava em posição de usar a solução de Pat Notz, que removeu completamente o commit indesejado. No entanto, inicialmente recebi o erro
error: failed to push some refs to 'ssh://git@gitrepo.git'
To prevent you from losing history, non-fast-forward updates were rejected*
Mas adicionar a -fopção force ( ) sobrescreve este erro
git push -f origin 52e36b294e:master
Se você tiver acesso direto ao repo remoto, poderá usar:
git reset --soft <sha1>
Isso funciona porque não há nenhuma tentativa de modificar o diretório de trabalho inexistente. Para obter mais detalhes, consulte a resposta original:
Como posso descomprimir o último commit em um repositório git bare?
git reset --hard [sha1]onde sha1 é o identificador hash do commit.