2011-08-07 39 views
36

Estoy usando GitHub como mi repositorio remoto.GitHub - Cómo revertir los cambios al estado anterior

Ya he enviado 5 commits al servidor y quiero volver al estado anterior a esos commits.

Si el hash de confirmación es 3425661dba2aadccdbab, ¿cómo revertir el local/remoto completo a esa confirmación? Probé

$ reset --hard 3425661dba2aadccdbab 

pero que sólo resetted la cabeza de trabajo a esa rama y me obliga a hacer un git pull nuevo. Intenté pagar, pero esto me hizo aterrizar en una sucursal de "cabeza separada".

+0

¿Necesita esta la etiqueta github? No parece ser específico de Github. – Nick

Respuesta

57

Es, básicamente, tiene dos opciones para revertir los cambios:

  1. crear un nuevo commit que se aplica cambios de marcha atrás. Esta es la opción preferida ya que no cambia el historial en un repositorio público
  2. Elimine las confirmaciones y fuerce empujándolas.

La primera opción se puede lograr mediante el uso de git revert

git-revert - Revert comete alguna existente

Dada una o confirmaciones más actuales, revertir los cambios que los parches relacionados introducen , y grabar algunos commits nuevos que los graban.

Un ejemplo sería git revert -n HEAD~5..HEAD. Este comando crea 5 nuevas confirmaciones, cada una deshace una de las últimas 5 confirmaciones de la rama actualmente desprotegida.

La segunda opción sería eliminar las confirmaciones. Tenga en cuenta que esto cambia el historial en el repositorio. Por lo tanto, cualquiera que ya haya sacado los cambios probablemente se sorprenda y las cosas se vuelvan complicadas rápidamente.Dicho esto, puede hacer

git reset --hard HEAD~5 
git push --force 

El primer comando borrará cualquier cambio no confirmado en su copia de trabajo actual. y reinicie su repositorio local al estado de las confirmaciones HEAD - 5 actuales. El segundo comando forzará la pulsación del control remoto predeterminado (es decir, GitHub) Allí, se sobrescribirán los cambios que diverjan de su depósito local actual.

Una advertencia: si no sabe realmente lo que está haciendo, no use esta opción ya que puede ocasionar la pérdida de datos para usted u otros si no se hace correctamente. Use la primera opción en su lugar, ya que eliminará los cambios de forma transparente, pero sin los desagradables efectos secundarios de la reescritura de historial.

+0

¿Puedes explicar lo que HEAD ~ 5..HEAD hace? –

+2

@RutgerHofste Describió el rango de confirmaciones entre 'HEAD' (es decir, la confirmación de compra actual) y 5 confirmaciones antes de' HEAD'. El 'git revert' crearía revertir commits para los últimos 5 commits. Del mismo modo, el comando 'git reset' movería la rama actual 5 commits hacia atrás. Ver [esta publicación en el blog] (http://www.paulboxley.com/blog/2011/06/git-caret-and-tilde) para obtener una buena explicación sobre cómo especificar commits relativ para los comandos. –

3

Haz un git push -f. No es una buena idea si hay otras personas que usan el mismo repositorio.

+0

Creo que el OP tiene otras personas que usan el mismo repo –

+0

Git lo rebase también antes de empujar, eso los enloquecerá aún más. =) – tjameson

+0

¿Es posible forzar el empuje solo a una rama específica? – cynistersix

2

Haz un pago por git, luego confírmalo a la sucursal que quieras. Esto hará una nueva confirmación con el código anterior (por lo que tendrás 6 commits).

git checkout HEAD~3, donde 3 es el número de confirmaciones a las que desea volver.

Mejor aún, usted puede comprobación de un solo archivo en el presente CABEZA:

git checkout 3425661dba2aadccdbab:path/to/file/from/base

Esto reducirá la probabilidad de hacer que otras personas enfadado contigo tirando de la alfombra proverbiales de debajo de sus pies.

EDIT:

Hay una pregunta similar aquí:

Checkout old commit and make it a new commit

+0

hmmm, pero como dijo el OP, si sale el git, terminará en una rama de "cabeza separada". lo tengo también antes;) –

2

Puede hacer git revert <commit> a todas las confirmaciones que se hayan realizado después de su estado requerido. (En el orden inverso para evitar cualquier conflicto.)

Esta es una manera limpia si hay otras personas que comparten el repositorio, pero un poco esforzado. (Sin embargo, puede automatizar ...?)

Cuestiones relacionadas