¿Cómo puedo revertir un repositorio de github a un commit específico?

431

Mi github tiene 100 commits en este momento. Necesito revertir el repositorio para confirmar 80, y eliminar todos los posteriores.

¿Por qué? Se supone que este repositorio es para la fusión de usuarios diversos. Un montón de fusiones entraron como confirmaciones de mí, debido a la edición excesiva. Eso se debió a un etiquetado incorrecto de mis sucursales remotas, donde 3 desarrolladores fueron etiquetados entre sí. Necesito reiniciar a ese punto, y luego tirar hacia adelante.

Quería volver a redactar, como en este ejemplo: ¿Cómo puedo eliminar un commit en GitHub?

Sin embargo, git quiere que haga mucho manejo de conflictos. ¿Hay una manera más sencilla?

Jonathan Vanasco
fuente

Respuestas:

883
git reset --hard <old-commit-id>
git push -f <remote-name> <branch-name>

Nota: Como está escrito en los comentarios a continuación, Usar esto es peligroso en un entorno colaborativo: estás reescribiendo el historial

jtdubs
fuente
43
gente, hazlo git push -f origin branch. Simplemente lo pasé mal, porque me lo perdí.
Sumit M Asok
21
¡CUIDADO con esto! perderá todos sus compromisos a nivel local, y si empuja no habrá vuelta atrás
Thomas
8
Eso no es cierto, puedes obtener los viejos commits usando git reflog
Jan Schaefer
27
es posible que deba hacer en git push origin HEAD --forcelugar de hacerlo, git push -f origin branchya que me estaba dando un error: src refspec branch does not match any.error
sprocket12
1
Sí, gracias chicos. Logré hacer lo que quería. Primero creé una rama separada de la anterior a la confirmación que quería revertir. Clonado localmente. Luego apliqué sus recomendaciones en esa copia, de esta manera, no comprometí mi rama principal ...
Gauthier Boaglio
21

Para deshacer la confirmación más reciente, hago esto:

Primero:

git log

obtenga la última identificación SHA para deshacer.

git revert SHA

Eso creará una nueva confirmación que hace exactamente lo contrario de su confirmación. Luego puede impulsar esta nueva confirmación para llevar su aplicación al estado que tenía antes, y su historial de git mostrará estos cambios en consecuencia.

Esto es bueno para rehacer de inmediato algo que acabas de cometer, y creo que es el caso más frecuente para mí.

Como Mike mencionó, también puede hacer esto:

git revert HEAD
Nick Res
fuente
8
git revert HEADrevertirá la última confirmación sin tener que buscar el hash.
Mike Baranczak 01 de
Esta es una solución si no desea eliminar confirmaciones en absoluto. Sin embargo, en este caso, todas las confirmaciones de basura seguirán allí y permitirán que un clonador las reinicie o les pague. Si quieres evitar eso, tendrás que empujar a la fuerza.
cst1992
19

De otra manera:

Verifique la sucursal que desea revertir, luego restablezca su copia de trabajo local de nuevo a la confirmación de que desea ser la última en el servidor remoto (todo después de que se vaya adiós). Para hacer esto, en SourceTree, hice clic derecho en y seleccioné "Restablecer BRANCHNAME a esta confirmación".

Luego navegue al directorio local de su repositorio y ejecute este comando:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f -- tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME 

Esto borrará todas las confirmaciones después de la actual en su repositorio local, pero solo para esa rama.

Tostada Coma
fuente
1
FYI "REPOSITORY_NAME" será algo así como https: /[email protected]/me/repo_name.git
tim
3
Sería más útil si desglosas ese comando y lo explicas.
cst1992
3

La mayoría de las sugerencias suponen que necesita destruir de alguna manera las últimas 20 confirmaciones, por lo que significa "reescribir el historial", pero no tiene que hacerlo.

Simplemente cree una nueva rama desde el commit # 80 y trabaje en esa rama en adelante. Los otros 20 commits permanecerán en la antigua rama huérfana.

Si quiere que su nueva sucursal tenga el mismo nombre, recuerde que la sucursal son básicamente etiquetas. Simplemente cambie el nombre de su antigua rama a otra, luego cree la nueva rama en commit # 80 con el nombre que desee.

Ion Lesan
fuente
Supongo que esto también causa problemas con las versiones locales de todos de la historia de la rama de interés.
ragerdl
2

Al hacer actualizaciones de rama desde el maestro, noto que a veces hago clic en exceso y hago que la rama también se fusione con el maestro. Encontré una manera de deshacer eso.

Si su último compromiso fue una fusión, se necesita un poco más de amor:

git revert -m 1 HEAD

Richard Nader
fuente
1

En github, la manera fácil es eliminar la rama remota en la interfaz de usuario de github, en la pestaña de ramas. Debe asegurarse de eliminar la siguiente configuración para que la rama sea borrable:

  1. No es una rama predeterminada
  2. No hay solicitudes de encuesta de apertura.
  3. La rama no está protegida.

Ahora vuelva a crearlo en su repositorio local para señalar el punto de confirmación anterior. y agregarlo de nuevo al repositorio remoto.

git checkout -b master 734c2b9b   # replace with your commit point

Luego empuje la rama local a remoto

git push -u origin master

Vuelva a agregar la rama predeterminada y la protección de rama, etc.

Jianwu Chen
fuente