Pregunta Deshaga un compromiso particular en Git que se ha enviado a los repos remotos


¿Cuál es la forma más sencilla de deshacer un compromiso en particular que es:

  • no en la cabeza o CABEZA
  • Ha sido empujado al control remoto.

Porque si no es la última confirmación,

git reset HEAD

no funciona Y debido a que ha sido empujado a un control remoto,

git rebase -i

y

git rebase --onto

causará algún problema en los controles remotos.

Más aún, no quiero modificar la historia realmente. Si había un código incorrecto, estaba allí en la historia y se puede ver. Solo quiero que salga en la copia de trabajo, y no me importa un compromiso de fusión inversa.

En otras palabras, ¿cuál es el Git equivalente de los siguientes comandos svn:

svn merge -r 303:295 http://svn.example.com/repos/calc/trunk

que elimina todos los cambios de 295 a 302 al fusionar de forma inversa todos los cambios en esas revisiones, como un nuevo compromiso.

svn merge -c -302 ^/trunk

que deshace el compromiso 302, por supuesto agregando otro commit que reverse fusiona los cambios de ese commit respectivo.

Pensé que debería ser una operación bastante simple en Git y un caso de uso bastante común. ¿Qué más es el punto de los compromisos atómicos?

Tenemos puesta en escena escondiendo y todo para asegurar que los commits sean perfectamente atómicos, ¿no deberías poder deshacer uno o más commits atómicos fácilmente?


605
2018-02-23 14:21


origen


Respuestas:


Identifica el hash de la confirmación, usando git log, luego usa git revert <commit> para crear una nueva confirmación que elimine estos cambios. En cierto sentido, git revert es el inverso de git cherry-pick - este último aplica el parche a una rama que falta, el anterior lo elimina de una rama que lo tiene.


945
2018-02-23 14:31



No me gusta el autocompromiso que git revert lo hace, por lo que esto podría ser útil para algunos.

Si solo quiere los archivos modificados, no el auto-commit, puedes usar --no-commit

% git revert --no-commit <commit hash>

que es lo mismo que -n

% git revert -n <commit hash>

290
2018-05-16 22:50



Debido a que ya ha sido empujado, no debe manipular directamente la historia. git revert revertirá los cambios específicos de una confirmación utilizando una nueva confirmación, para no manipular el historial de compromisos.


32
2018-02-23 14:28