Revertir un repositorio de Git remoto

111

Tengo un repositorio de Git remoto y necesito revertir las últimas nconfirmaciones al olvido.

Jake
fuente

Respuestas:

135

Puede usar git revert <commit>…para todas las n confirmaciones y luego presionar como de costumbre, manteniendo el historial sin cambios.

O puede "retroceder" con git reset --hard HEAD~n. Si está presionando en un repositorio público o compartido, puede divergir y romper el trabajo de otros en función de su rama original. Git te impedirá hacerlo, pero puedes usarlo git push -fpara forzar la actualización.

elmarco
fuente
5
Puede revertir a una confirmación específica utilizando: git reset --hard [sha1]donde sha1 es el identificador hash de confirmación.
pisaruk
7
No puede usar get reset --hard en un repositorio remoto ya que no hay un directorio de trabajo. La pregunta original solo dice que hay un repositorio remoto, no se menciona un repositorio local.
Hazok
2
solo una nota, git push -f forzará el empuje de todas las sucursales locales a sus controles remotos
cowlinator
Tenga en cuenta que el uso reverthará que sus ramas de funciones se traten como "ya" fusionadas. Eso es porque estas ramas son en realidad están fusionando. Pero los cambios se revirtieron. Solución: seleccione o revierte la confirmación de reversión .
Benedikt
@Benedikt, ¿ reset --hardtambién hace que las ramas de funciones se traten como ya fusionadas? Mi suposición es que no lo haría (donde lo revertharía).
Marcus Leon
37

elmarco tiene razón ... su sugerencia es la mejor para repositorios compartidos / públicos (o, al menos, sucursales públicas). Si no fue compartido (o está dispuesto a interrumpir a otros), también puede presionar una referencia en particular:

git push origin old_master:master

O, si hay una confirmación SHA1 en particular (digamos 1e4f99e en forma abreviada) a la que le gustaría regresar:

git push origin 1e4f99e:master
Pat Notz
fuente
9

Afortunadamente, pude usar la solución de Pat Notz que eliminó por completo la confirmación no deseada. Sin embargo, inicialmente recibí el error

error: failed to push some refs to 'ssh://[email protected]'
To prevent you from losing history, non-fast-forward updates were rejected*

Pero agregar la -fopción force ( ) sobrescribe este error

git push -f origin 52e36b294e:master
geedoubleya
fuente
3

Si tiene acceso directo al repositorio remoto, siempre puede usar:

git reset --soft <sha1>

Esto funciona ya que no se intenta modificar el directorio de trabajo que no existe. Para obtener más detalles, consulte la respuesta original:

¿Cómo puedo eliminar la última confirmación en un repositorio desnudo de git?

Hazok
fuente
2
¿Por qué --softincluso sería necesario? Probablemente podría hacer lo mismo con simplemente git reset, sin el indicador de modo.