Dado un cambio que se ha comprometido usando commit
, y luego revertido usando revert
, ¿cuál es la mejor manera de deshacer ese revertir?
Idealmente, esto debería hacerse con una nueva confirmación, para no volver a escribir el historial.
Dado un cambio que se ha comprometido usando commit
, y luego revertido usando revert
, ¿cuál es la mejor manera de deshacer ese revertir?
Idealmente, esto debería hacerse con una nueva confirmación, para no volver a escribir el historial.
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 luego git add -A && git commit
.
git cherry-pick
o alternativamente git 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
Un commit revertido es como cualquier otro commit en git. Es decir, puede revertirlo, como en:
git revert 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746
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é:
7963f4b2a9d Revert "Revert "OD-9033 parallel reporting configuration"
"This reverts commit a0e5e86d3b66cf206ae98a9c989f649eeba7965f.
...
a0e5e86d3b6 Revert "OD-9055 paralel reporting configuration"
This reverts commit 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746.
...
Merge pull request parallel_reporting_dbs to master* commit
'648d7d808bc1bca6dbf72d93bf3da7c65a9bd746'
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.
Revertir la reversión hará el truco
Por ejemplo,
Si abcdef
es su confirmación y ghijkl
es la confirmación que tiene cuando revirtió la confirmación abcdef
, ejecute:
git revert ghijkl
Esto revertirá la reversión
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.
Así es como lo hice:
si la rama my_branchname
se incluyó en una fusión que se revirtió. Y quería revertir my_branchname
:
Primero hago un git checkout -b my_new_branchname
de my_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 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.
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
P---o---o---M---x---x---W---x
\ /
A---B---C----------------D---E <-- fixed-up topic branch
(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:
$ git checkout E
$ git rebase --no-ff P
La nueva copia de su sucursal ahora se puede fusionar master
nuevamente:
A'---B'---C'------------D'---E' <-- recreated topic branch
/
P---o---o---M---x---x---W---x
\ /
A---B---C----------------D---E
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:
git ls-files -d | xargs git checkout --