pick - ¿Cómo puedo "deshacer" un commit de Git revertido?
git revert vs reset (8)
Así es como lo hice:
Si la rama my_branchname
se incluyó en una fusión que se revertió. Y quise deshacer 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 confirmación antes de la primera confirmación de my_branchname
(ver git log
)
Luego hago un nuevo commit git commit -m "Add back reverted changes"
Luego git push origin new_branchname
la nueva rama git push origin new_branchname
Entonces hice una solicitud de extracción para la nueva sucursal.
Dado un cambio que se ha cometido con el uso de commit
, y luego revertido con revert
, ¿cuál es la mejor manera de deshacer esa reversión?
Idealmente, esto debería hacerse con un nuevo compromiso, para no volver a escribir el historial.
Es una estupidez para mí. Pero había estado en la misma situación y volví para las confirmaciones revertidas. Hice reinversiones de números, así que tuve que revertir para cada ''revertir confirmación''.
Ahora mi historial de errores parece un poco extraño.
Es un proyecto de mascotas por lo que está bien. Pero para el proyecto de la vida real, preferiría ir a la última confirmación antes de revertir restaurar todo el código revertido en una confirmación y un comentario más razonable.
O puede git checkout -b <new-branch>
y git cherry-pick <commit>
el anterior a la git rebase
y git rebase
para soltar revert
commit. enviar solicitud de extracción como antes.
Revertir el revertir hará el truco
Por ejemplo,
If abcdef is your commit and ghijkl is the commit you have when you reverted the commit abcdef,
A continuación, escriba
git revert ghijkl
Esto revertirá el revertir.
Si aún no ha presionado ese cambio, git reset --hard HEAD^
De lo contrario, revertir el revertido está perfectamente bien.
Otra forma es git checkout HEAD^^ -- .
y luego git add -A && git commit
.
Si no te gusta la idea de "revertir una reversión" (especialmente cuando eso significa perder información de historial para 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 la reversión inicial de la combinación M; D y E son correcciones de la rama / confirmación de la característica inicialmente dañada)
Ahora puede simplemente repetir los compromisos A a E, de modo que ninguno de ellos "pertenezca" a la fusión revertida:
$ git checkout E
$ git rebase --no-ff P
La nueva copia de tu rama ahora se puede combinar para master
nuevo:
A''---B''---C''------------D''---E'' <-- recreated topic branch
/
P---o---o---M---x---x---W---x
/ /
A---B---C----------------D---E
Un commit de revertir es como cualquier otro commit en git. Es decir, puedes revertirlo, como en:
git revert 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746
Eso, obviamente, solo tiene sentido una vez que se presionaron los cambios, y especialmente cuando no se puede forzar el empuje en la rama de destino (lo cual es una buena idea para su rama maestra ). Si no se ha realizado el cambio, simplemente haga un pick-in, revertir o simplemente elimine la confirmación de revertir según otras publicaciones.
En nuestro equipo, tenemos una regla para revertir los comentarios de Revertir que se confirmaron en la rama principal, principalmente para mantener el historial limpio, de modo 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 la historia completa, e incluso aquellos sin el conocimiento del legado podrían resolverlo por sí mismos. Mientras que, si elige cosas o cambia de base , esta valiosa información se pierde (a menos que la incluya en el comentario).
Obviamente, si un compromiso se revierte y se revierte más de una vez, se vuelve bastante desordenado.
git cherry-pick <original commit sha>
Hará una copia de la confirmación original, esencialmente volviendo 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á git push
sin sobrescribir el historial, ya que crea un nuevo commit después de la reversión.
Al escribir el commit sha, normalmente solo necesitas los primeros 5 o 6 caracteres:
git cherry-pick 6bfabc