2012-04-17 25 views
23

Tengo un servidor web que sirve un proyecto que es un repositorio git. Cuando hago algunos cambios en el código, hago un git pull desde el servidor. A veces, el nuevo código simplemente se bloquea, me gustaría poder hacer una reversión a la última extracción, la anterior. Quiero hacer eso con un script, sin tener que buscar cuál es el último sha. ¿Cómo puedo hacer eso?Git rollback 1 pull

Editar: Solo para aclarar, solo quiero tener que hacer una acción, como presionar un botón que dice "Uy, esta última extracción que acabo de hacer fue un error, ojalá no lo haya hecho". No quiero tener que buscar etiquetas o sha o cualquier otra cosa en esta situación, es más como una función 'deshacer'. Luego quiero poder continuar trabajando en el código y la próxima extracción en el servidor necesita traer los últimos cambios.

Respuesta

52

git reset --hard HEAD^1 lo llevará de regreso a uno por lo que sacó. Si quiere que vuelva al estado en el que estaba antes de tirar, use git reset --hard [email protected]{1}. El @{1} rastrea dónde estaba la cabeza antes de la última operación que lo cambió en su repositorio local, por lo que retrocederá varias confirmaciones si se empujaron varias antes de realizar su extracción. También vea git reflog para mostrar la lista completa.

+1

muy interesante, y ¿cómo volvería a la operación normal? Quiero decir, si hago algunas correcciones en el código incorrecto, ¿puedo ir al servidor y hacer un jalón de nuevo para llegar a los últimos cambios? – Bastian

+3

Sí, estará en un estado en el que nunca tiraste, por lo que cualquier cosa que normalmente harías se puede hacer. –

2

git reset HEAD^ debería llevarlo a la confirmación anterior. Ver here para más información.

+0

De hecho, es 'git reset CABEZA --hard ^', a menos que no quiere tocar el directorio de trabajo. –

+0

Según la pregunta, el repositorio solo necesita deshacerse después de que una nueva extracción provoque un problema, por lo que el directorio de trabajo debería estar vacío. –

0

Otra forma de hacerlo sería utilizar etiquetas. Si piensas etiquetar tu HEAD con un número de versión antes de tirar, tira, entonces si necesitas tirar la HEAD hacia atrás, puedes hacer git reset {tag name}. De esta forma, si la atracción tiene múltiples compromisos, puedes saltar al lugar donde estabas. antes de la fusión.

2

En este caso, puede tener sentido utilizar una derivación, que puede eliminarse fácilmente o fusionarse en caso de fallo o éxito. Esto lo ayudará a realizar un seguimiento de las novedades y a hacer las cosas más claras si tiene casos más complicados que "simplemente elimine el último compromiso" (especialmente porque quiere hacer eso con un script). Así que en su servidor:

git fetch --all   # fetch new commits from remote 
git checkout -b testing # create and switch to branch 'testing' 
git merge origin/master # merge new commits from remote branch master 
          # (in branch 'testing') 

... entonces ... cosas de la prueba si el éxito:

git checkout master  # switch back to master 
git merge testing 

y en caso de fallo:

git checkout master 
git branch -D testing  # remove testing branch 

Pero de todos modos ... Es su única punto es eliminar el último compromiso, puede usar git reset como lo señala Josh.

+0

Buen punto aquí, no es en lo que estaba pensando pero podría funcionar muy bien. Trataré de ir con el método más simple. – Bastian

1

La respuesta aceptada por @Karl Bielefeldt no funcionó exactamente para mí. Estoy usando GIT versión 2.10.0.windows.1 Puede ser esto funcionó para versiones anteriores. Estoy recibiendo el error "interruptor desconocido e '". Finalmente, hice algunos cambios y funcionó.

A continuación se presentan los pasos para volver a estado antes de tracción anterior:

  1. Uso git reflog Para ver la lista como Karl mencionado.
  2. Elija la versión de confirmación de la lista a la que desea retroceder.
  3. Ejecutar git reset --hard <commit version>