Tenga en cuenta que si desea deshacer la reversión sin aplicar de inmediato los cambios originales a la rama maestra, puede (1) restaurar la rama original si se elimina, (2) hacer clic en "revertir" en la rama de reversión como señaló Adam, y luego ( 3) haga clic en "editar" en el encabezado del RP resultante y cambie la rama de destino a la rama original en lugar de master. Ahora su rama original se puede volver a fusionar para efectuar los cambios revertidos anteriormente.
pauljm
1
Tenga en cuenta que esto eliminará todos los cambios en el árbol de trabajo y el índice. Use git stash para guardar cualquier cambio que no quiera perder.
zpon
3
¿Cuál es la ventaja del método de pago y confirmación? Parece que en el caso general git cherry-picko alternativamente git revertson las formas más directas para revertir una reversión.
Robert Jack Will
55
Creo que sería útil mostrar cómo: Otherwise, reverting the revert is perfectly fine.y luego explicar qué git checkout HEAD^^ -- .está haciendo.
Todd
3
Buen señor, no uses git add -A... a menos que quieras agregar todos los archivos al control de versiones, lo que probablemente no sea lo que deseas.
Kaitain
474
git cherry-pick <original commit sha>
Hará una copia de la confirmación original, esencialmente volver a aplicar la confirmación
Revertir la reversión hará lo mismo, con un mensaje de confirmación más desordenado: git revert <commit sha of the revert>
Cualquiera de estas formas le permitirá hacerlo git pushsin sobrescribir el historial, ya que crea una nueva confirmación después de la reversión.
Al escribir commit sha, normalmente solo necesita los primeros 5 o 6 caracteres: git cherry-pick 6bfabc
Esta es fácilmente la solución más elegante y completa a la pregunta de los OP. Mucho mejor que la respuesta aceptada con sus suposiciones acerca de que el commit de reversión está en el HEAD del árbol de commit. La operación también solicitó específicamente una solución que no reescriba el historial, por lo que la solución difícil ofrecida en la respuesta aceptada es simplemente incorrecta.
Timo
66
@Timo Para aclarar, la respuesta aceptada contiene la solución que usé ("revertir la reversión"), y se publicó a las pocas horas de mi pregunta, un claro 3 años antes de esta respuesta. Por lo tanto, la marca de verificación.
JimmidyJoo
66
@JimmidyJoo Sé que llegué 3 años tarde, solo quería que la gente viniera de una búsqueda en Google para ver una mejor respuesta
Stephan
2
@Stephan Sí, pero de nuevo, para aclarar, es una mejor respuesta, no la que solía resolver mi problema. Simplemente comentaba por qué la marca de verificación está donde está. Pregunta para todos: ¿la convención SO dicta que debo "mantener" mis preguntas pasadas y reasignar las marcas de verificación a medida que aparecen nuevas respuestas?
JimmidyJoo
3
@JimmidyJoo No tengo idea sobre la convención SO. Pero como buscador de google, realmente prefiero ver la mejor respuesta marcada. Y agradecería los esfuerzos de cualquiera para mantener sus preguntas pasadas.
Paiman Roointan
30
Un commit revertido es como cualquier otro commit en git. Es decir, puede revertirlo, como en:
Obviamente, eso solo tiene sentido una vez que se presionaron los cambios, y especialmente cuando no se puede forzar el empuje hacia la rama de destino (que es una buena idea para su rama maestra ). Si el cambio no se ha presionado, simplemente haga una selección de cereza, revierta o simplemente elimine la confirmación de reversión según otras publicaciones.
En nuestro equipo, tenemos una regla para usar una reversión en las confirmaciones de reversión que se confirmaron en la rama principal, principalmente para mantener el historial limpio, para que pueda ver qué confirmación revierte qué:
De esta manera, puede rastrear la historia y descubrir toda la historia, e incluso aquellos sin el conocimiento del legado podrían resolverlo por sí mismos. Mientras que, si selecciona o rebase cosas, esta información valiosa se pierde (a menos que la incluya en el comentario).
Obviamente, si un commit se revierte y se revierte más de una vez, eso se vuelve bastante desordenado.
Se ve estúpido para mí. Pero había estado en la misma situación y volví por compromisos revertidos. Realicé reversiones de números, así que tuve que hacer revertir para cada 'revert commit'.
Ahora mi historial de confirmaciones parece un poco extraño.
Es un proyecto favorito, por lo que está bien. Pero para un proyecto de la vida real, preferiría ir a la última confirmación antes de revertir restaurar todo el código revertido juntos en una confirmación y un comentario más razonable.
Puede evitar la confirmación automática y elegir el mensaje de confirmación con el indicador --no-commit al revertir y luego confirmar con el mensaje relevante
David Barda
También puede especificar múltiples ID de confirmación cuando use git revert (creo que tienen que estar en el orden correcto).
Aalex Gabi
¿Puedo hacer eso desde el escritorio de github?
Guillaume F.
4
Así es como lo hice:
si la rama my_branchnamese incluyó en una fusión que se revirtió. Y quería revertir my_branchname:
Primero hago un git checkout -b my_new_branchnamede my_branchname.
Luego hago un git reset --soft $COMMIT_HASHdónde $COMMIT_HASHestá el hash de confirmación de la confirmación justo antes de la primera confirmación de my_branchname(ver git log)
Luego hago una nueva confirmación git commit -m "Add back reverted changes"
Luego empujo hacia arriba la nueva rama git push origin new_branchname
Luego hice una solicitud de extracción para la nueva rama.
Camino a seguir cuando hay demasiadas "selección de cerezas" para hacer. No entiendo por qué esta respuesta tiene tan pocos votos positivos
Fundhor
2
O podría git checkout -b <new-branch>y git cherry-pick <commit>el antes a la y git rebasedejar de revertconfirmar. Enviar solicitud de extracción como antes.
Si no le gusta la idea de "revertir una reversión" (especialmente cuando eso significa perder información del historial para muchas confirmaciones), siempre puede dirigirse a la documentación de git sobre "Revertir una fusión defectuosa" .
Buena idea y gracias por el enlace del documento. Por lo general, reforzamos con master antes de volver a fusionarnos, pero git parece reconocer que A ', B', C 'son las mismas que antes, y ahora tengo D, E después de W ( pastebin ). ¿Sugerencias sobre cómo resolver esto?
Kristoffer Bakkejord
0
Para recuperar los cambios no organizados y en escena que se revertieron después de una confirmación:
git reset HEAD@{1}
Para recuperar todas las eliminaciones no preparadas:
Respuestas:
Si aún no has presionado ese cambio,
git reset --hard HEAD^
De lo contrario, revertir la reversión está perfectamente bien.
Otra forma es
git checkout HEAD^^ -- .
y luegogit add -A && git commit
.fuente
git cherry-pick
o alternativamentegit revert
son las formas más directas para revertir una reversión.Otherwise, reverting the revert is perfectly fine.
y luego explicar quégit checkout HEAD^^ -- .
está haciendo.git add -A
... a menos que quieras agregar todos los archivos al control de versiones, lo que probablemente no sea lo que deseas.git cherry-pick <original commit sha>
Hará una copia de la confirmación original, esencialmente volver a aplicar la confirmación
Revertir la reversión hará lo mismo, con un mensaje de confirmación más desordenado:
git revert <commit sha of the revert>
Cualquiera de estas formas le permitirá hacerlo
git push
sin sobrescribir el historial, ya que crea una nueva confirmación después de la reversión.Al escribir commit sha, normalmente solo necesita los primeros 5 o 6 caracteres:
git cherry-pick 6bfabc
fuente
Un commit revertido es como cualquier otro commit en git. Es decir, puede revertirlo, como en:
Obviamente, eso solo tiene sentido una vez que se presionaron los cambios, y especialmente cuando no se puede forzar el empuje hacia la rama de destino (que es una buena idea para su rama maestra ). Si el cambio no se ha presionado, simplemente haga una selección de cereza, revierta o simplemente elimine la confirmación de reversión según otras publicaciones.
En nuestro equipo, tenemos una regla para usar una reversión en las confirmaciones de reversión que se confirmaron en la rama principal, principalmente para mantener el historial limpio, para que pueda ver qué confirmación revierte qué:
De esta manera, puede rastrear la historia y descubrir toda la historia, e incluso aquellos sin el conocimiento del legado podrían resolverlo por sí mismos. Mientras que, si selecciona o rebase cosas, esta información valiosa se pierde (a menos que la incluya en el comentario).
Obviamente, si un commit se revierte y se revierte más de una vez, eso se vuelve bastante desordenado.
fuente
Revertir la reversión hará el truco
Por ejemplo,
Si
abcdef
es su confirmación yghijkl
es la confirmación que tiene cuando revirtió la confirmaciónabcdef
, ejecute:Esto revertirá la reversión
fuente
Se ve estúpido para mí. Pero había estado en la misma situación y volví por compromisos revertidos. Realicé reversiones de números, así que tuve que hacer revertir para cada 'revert commit'.
Ahora mi historial de confirmaciones parece un poco extraño.
Es un proyecto favorito, por lo que está bien. Pero para un proyecto de la vida real, preferiría ir a la última confirmación antes de revertir restaurar todo el código revertido juntos en una confirmación y un comentario más razonable.
fuente
Así es como lo hice:
si la rama
my_branchname
se incluyó en una fusión que se revirtió. Y quería revertirmy_branchname
:Primero hago un
git checkout -b my_new_branchname
demy_branchname
.Luego hago un
git reset --soft $COMMIT_HASH
dónde$COMMIT_HASH
está el hash de confirmación de la confirmación justo antes de la primera confirmación demy_branchname
(vergit log
)Luego hago una nueva confirmación
git commit -m "Add back reverted changes"
Luego empujo hacia arriba la nueva rama
git push origin new_branchname
Luego hice una solicitud de extracción para la nueva rama.
fuente
O podría
git checkout -b <new-branch>
ygit cherry-pick <commit>
el antes a la ygit rebase
dejar derevert
confirmar. Enviar solicitud de extracción como antes.fuente
Si no le gusta la idea de "revertir una reversión" (especialmente cuando eso significa perder información del historial para muchas confirmaciones), siempre puede dirigirse a la documentación de git sobre "Revertir una fusión defectuosa" .
Dada la siguiente situación inicial
(W es su reversión inicial de la fusión M; D y E son arreglos para su rama / confirmación de característica inicialmente rota)
Ahora puede simplemente repetir las confirmaciones de A a E, para que ninguna de ellas "pertenezca" a la fusión revertida:
La nueva copia de su sucursal ahora se puede fusionar
master
nuevamente:fuente
Para recuperar los cambios no organizados y en escena que se revertieron después de una confirmación:
Para recuperar todas las eliminaciones no preparadas:
fuente