Revertendo um repositório Git remoto

111

Eu tenho um repositório Git remoto e preciso reverter os últimos ncommits para o esquecimento.

Jake
fonte

Respostas:

135

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.

elmarco
fonte
5
Você pode reverter para um commit específico usando: git reset --hard [sha1]onde sha1 é o identificador hash do commit.
pisaruk
7
Você não pode usar get reset --hard em um repositório remoto, pois não há um diretório de trabalho. A pergunta original afirma apenas que existe um repo remoto, não há menção de um repo local.
Hazok
2
apenas uma observação, git push -f forçará o envio de todos os branches locais para seus remotos
cowlinator
Lembre-se de que usar 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 .
Benedikt
@Benedikt reset --hardtambém faz com que os branches do recurso sejam tratados como já mesclados? Minha suposição é que não (onde revertseria).
Marcus Leon,
37

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
Pat Notz
fonte
9

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://[email protected]'
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
geedoubleya
fonte
3

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?

Hazok
fonte
2
Por que --softmesmo seria necessário? Você provavelmente poderia fazer a mesma coisa com simplesmente git reset, sem o sinalizador de modo.