2009-12-28 18 views
22

Anteriormente, cometí algún código que en ese momento parecía una buena idea, pero de hecho empeoró las cosas. Me gustaría eliminar el cambio del historial ya que no es útil, y volver a establecer la base de todos los commits, ya que todos deberían fusionarse sin problemas.GIT deshacer una confirmación que no es la más reciente, rebase todos los commits desde

He intentado crear una nueva rama (llamado newMaster) inmediatamente antes de la entrega mala (con gitx), echarle un vistazo y en ejecución:

git rebase -i master 

Qué AFAICS debería haberme dado una lista de las confirmaciones de maestro y la opción de fusionarlas o no, pero en su lugar decía noop, y reenviaba rápido a newMaster para que fuera igual a master.

¿Cuál es la forma más fácil de hacer lo que necesito?

Respuesta

12

git rebase -i es el comando correcto, pero desea hacerlo desde la sucursal con los cambios más recientes, y pasar la revisión que es la "base" de la operación de rebase (la revisión inmediatamente anterior a la confirmación incorrecta). Por lo tanto, si ha creado una rama last-good-commit que apunta a la última cometió, le desea ejecutar la siguiente, mientras que en master:

git rebase -i last-good-commit 
+3

Proporcionar más argumentos puede hacer que sea más intuitivo, también - 'git rebase -i last-good-commit master' hace lo mismo (comprueba master y luego rebases usando last-good-commit como base). – Cascabel

29

La manera más fácil de hacer lo que desea es permanecer encendido (o re-verificar) la rama que desea editar y ejecutar algo como esto.

git rebase --onto <sha1-of-bad-commit>^ <sha1-of-bad-commit> 

Esto se rebase todo ya que la entrega mala sobre el mal padre de cometer, eliminando de forma eficaz la mala commiit de la historia de su rama actual. Por supuesto, tendrá que resolver cualquier conflicto si se producen.

+7

Una remota: Esto destruyó mi repositorio . – Malvolio

+1

Tienes que hacer un 'git push --force' para que funcione. Pero sé * muy * cuidadoso con eso. – redolent

2

Usando rebase, yo no era capaz de empujar los cambios en la distancia, y mi rebase fue cancelada en cada extracción.

que lograron revertir una precisa comprometerse (no el último) con, simplemente:

git revert <sha-of-bad-commit> 

Y entonces yo también era capaz de empujar en el punto de datos

+0

Si rebase después de un empujón, necesita forzar el empuje usando 'git push -f'. Úselo con extrema precaución, ya que puede eliminar los cambios de otras personas en el destino. – rjmunro

Cuestiones relacionadas