2011-01-21 6 views
45

Considere este escenario:¿Cómo revertir las dos confirmaciones anteriores?

  1. desarrollador A no una confirmación: #n
  2. Dev. B confirma # n + 1
  3. Dev. Una hace cometer # n + 2
  4. y comprometerse # n + 3

y luego descubre que en su comprometerse nº n + 2, introdujo un defecto.

¿Cómo puede dev. Una reversión de sus 2 últimos commits y continuar desarrollando en commit # n + 1?

Probamos git reset --hard HEAD~2*, pero va a volver a dev de cometer un #n.

+0

git reset HEAD ~ 2 debe reiniciarse a # n + 1 commit si ha realizado B commits en ese punto. ¿Los sacaste? – Snowbear

+0

... no antes de # n + 2 commit. Era: [0] B empujó 'commit' # n + 1, [1] A' commit'ted # n + 2, [2] fracasado 'push', [3]' pull', [4] 'push' . Entonces en github ahora hay una confirmación (# n + 2) y una rama de combinación 'master' (# n + 3). –

+1

Si ya ha publicado la confirmación, no debe usar reiniciar para deshacerla. (Si algún otro desarrollador desconocido para ti ha sacado, esto causará dolor). En su lugar, utiliza revertir y hacer un nuevo compromiso que te lleve al estado que deseas. Nunca cambie un historial publicado. Ver http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html –

Respuesta

76

Debería volver al compromiso n + 1. Es probable que también tengas un compromiso de fusión allí. También puede hacer un git reset --hard <sha1_of_where_you_want_to_be>

¡ADVERTENCIA! --hard significa que cualquier cambio no confirmado que tenga actualmente se descartará de forma permanente.

+1

¿Cómo obtengo el sha1 de una confirmación remota (no hecho por mí)? Intenté usar 'git reflog', pero solo puedo acceder a la información de mi reflog local, por ejemplo, confirma #n, # n + 2, # n + 3 ... pero no # n + 1 –

+8

Obtuve el sha1 que quería un 'git log', pero también se requiere' git push -f', por lo que las modificaciones se reflejarían en github. –

+0

Sí, pero no sabía que quería actualizar un control remoto :) –

Cuestiones relacionadas