¿Cómo revertir las dos confirmaciones anteriores?

83

Considere este escenario:

  1. El desarrollador A realiza una confirmación: #n
  2. Dev. B se compromete # n + 1
  3. Dev. A se compromete # n + 2
  4. y comete # n + 3

y luego descubre que en su commit # n + 2 introdujo un defecto.

¿Cómo puede dev. ¿Deshacer sus 2 últimas confirmaciones y continuar desarrollando en la confirmación # n + 1 ?

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

Marius Butuc
fuente
2
git reset HEAD ~ 2 debería reiniciarse en # n + 1 commit si ha sacado B commits en ese punto. ¿Los sacaste?
Snowbear
1
... no antes de la confirmación # n + 2. Fue: [0] B presionó commit# n + 1, [1] A committed # n + 2, [2] fallido push, [3] pull, [4] push. Entonces, en github ahora hay una confirmación (# n + 2) y una rama de combinación 'maestra' (# n + 3).
Marius Butuc
2
Si ya ha publicado la confirmación, no debe utilizar reset para revertirla. (Si algún otro desarrollador desconocido para ti se ha retirado, esto te causará dolor.) En su lugar, usa revert y haz una nueva confirmación que te lleve al estado que deseas. Nunca cambie un historial publicado. Ver book.git-scm.com/…
William Pursell

Respuestas:

122

Debería volver a la confirmación n + 1. Probablemente también tenga un compromiso de fusión allí. También puedes hacer ungit reset --hard <sha1_of_where_you_want_to_be>

¡¡ADVERTENCIA!! --hardsignifica que los cambios no confirmados que tenga actualmente se desecharán de forma permanente.

Adam Dymitruk
fuente
2
¿Cómo obtengo el sha1 de una confirmación remota (no hecha 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
Marius Butuc
13
Obtuve el sha1 que quería de a git log, pero git push -ftambién se requería a, por lo que las modificaciones se reflejarían en github.
Marius Butuc
1
Sí, pero no sabía que también querías actualizar un control remoto :)
Adam Dymitruk
25
¡¡ADVERTENCIA!! --hardsignifica que los cambios no confirmados que tenga actualmente se desecharán de forma permanente. Para volver a una confirmación anterior sin tirar tu trabajo, usa --soft.
Ken M. Haggerty
4
Explique el uso de --hard en lugar de --soft
iuridiniz