¿Cómo puedo "des-revertir" una confirmación Git revertida?


Dado un cambio que ha sido confirmado usando commit, y luego revertido usando revert, ¿cuál es la mejor manera de deshacer esa reversión?

Idealmente, esto debería hacerse con una nueva confirmación, para no reescribir la historia.

Author: JimmidyJoo, 2012-01-04

8 answers

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.

 236
Author: Adam Dymitruk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-05 10:07:34

git cherry-pick <original commit sha>
Hará una copia del commit original, esencialmente re-aplicando el commit

Revertir la reversión hará lo mismo, con un mensaje de confirmación messier:
git revert <commit sha of the revert>

Cualquiera de estas formas le permitirá git push sin sobrescribir el historial, porque crea una nueva confirmación después de la reversión.
Al escribir el sha de confirmación, normalmente solo necesita los primeros 5 o 6 caracteres:
git cherry-pick 6bfabc

 273
Author: Stephan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-30 18:46:53

Se ve estúpido para mí. Pero yo había estado en la misma situación y lo hice revertir para confirmaciones revertidas. Hice reversiones de números, así que tuve que hacer reversiones para cada 'revert commit'.

Ahora mi historial de confirmaciones se ve un poco raro.

historia extraña

Es un proyecto mascota, por lo que está bien. Pero para el proyecto de la vida real, daría preferencia por 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.

 2
Author: RredCat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-23 20:00:51

O podrías git checkout -b <new-branch> y git cherry-pick <commit> el antes al y git rebase para soltar revert confirmar. enviar solicitud de extracción como antes.

 2
Author: Ryan Chou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-23 09:09:29

Un commit revert es como cualquier otro commit en git. Es decir, se puede revertir, como en:

git revert 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746

Eso obviamente solo tiene sentido una vez que los cambios fueron empujados, y especialmente cuando no se puede forzar el empuje en la rama de destino (que es una buena idea para su master rama). Si el cambio no ha sido empujado, simplemente haz cherry-pick, revierte o simplemente elimina la confirmación de reversión según otras publicaciones.

En nuestro equipo, tenemos una regla para usar un revert en Revert comentarios que fueron confirmados 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, puedes rastrear la historia y averiguar toda la historia, e incluso aquellos que no tienen el conocimiento del legado podrían resolverlo por sí mismos. Mientras que, si eligeo rebase cosas, esta información valiosa se pierde (a menos que la incluya en el comentario).

Obviamente, si un commit revirtió y re-revertido más de una vez que se vuelve bastante desordenado.

 1
Author: Nestor Milyaev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-29 09:25:35

Si no te gusta la idea de "revertir una reversión" (especialmente cuando eso significa perder información del historial de muchas confirmaciones), siempre puedes dirigirte a la documentación de git sobre "Revertir una fusión defectuosa".

Dada la siguiente situación de partida

 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 correcciones a su rama/confirmación de entidad inicialmente rota)

Ahora puede simplemente reproducir confirmaciones de A a E, de modo que ninguna de ellas "pertenece" a la revertida merge:

$ git checkout E
$ git rebase --no-ff P

La nueva copia de su rama ahora se puede fusionar a master de nuevo:

   A'---B'---C'------------D'---E'  <-- recreated topic branch
  /
 P---o---o---M---x---x---W---x
  \         /
   A---B---C----------------D---E
 0
Author: NobodysNightmare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-14 09:03:04

Así es como lo hice:
Si la rama my_branchname se incluyó en una fusión que se revirtió. Y yo quería no convertir my_branchname:

Primero hago un git checkout -b my_new_branchname desde my_branchname.
Luego hago un git reset --soft $COMMIT_HASH donde $COMMIT_HASH es el hash de commit del commit correcto antes de el primer commit de my_branchname (ver git log)
Entonces hago un nuevo commit git commit -m "Add back reverted changes"
Luego subo la nueva rama git push origin new_branchname
Luego hice una solicitud de extracción para la nueva sucursal.

 0
Author: Drew LeSueur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-25 01:52:25

Revertir la reversión hará el truco

Por ejemplo,

If abcdef is your commit and ghijkl is the commit you have when you reverted the commit abcdef,

Luego escriba,

git revert ghijkl

Esto revertirá la reversión

 0
Author: Rafeeque KP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-18 07:15:53