2010-02-23 6 views
562

¿Cuál es la forma más sencilla de deshacer una confirmación en concreto es:deshacer una confirmación en concreto en Git que ha sido empujado a pases remotos

    no
  • en la cabeza o la cabeza
  • ha sido empujado a la distancia.

Porque si no es la última confirmación,

git reset HEAD 

no funciona. Y porque ha sido empujado a un mando a distancia,

git rebase -i 

y

git rebase --onto 

causará algún problema en los mandos a distancia.

Más aún, no quiero modificar realmente el historial. 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 la 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 fusión inversa todos los cambios en esas revisiones, como un nuevo comprometerse.

svn merge -c -302 ^/trunk 

que deshace el 302 confirmación, por supuesto, por la adición de otro commit que inversa fusiona los cambios de ese respectivo cometido.

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 a stashing y todo para asegurar que los commits sean perfectamente atómicos, ¿no debería poder deshacer uno o más de estos commits atómicos fácilmente?

Respuesta

877

Identifique el hash de la confirmación, usando git log, luego use git revert <commit> para crear una nueva confirmación que elimine estos cambios. En cierto modo, 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.

+174

Y utilizar el parámetro -n si Desea que se devuelva el código, pero no se confirma automáticamente en – jaygooby

+9

¿Qué hace la opción "m"? Probé git revert 8213f7d pero obtuve esto en su lugar: error: Commit 8213f7dad1ed546b434a0d8a64cb783b530a5a30 es una fusión, pero no se dio la opción -m. fatal: revertió el error – Malcolm

+1

'git help revert' dice que le permite elegir a qué padre de la fusión desea volver. No puede revertir una combinación sin elegir un padre. La documentación lo dirige a https://www.kernel.org/pub/software/scm/git/docs/howto/revert-a-faulty-merge.txt –

32

Como ya se ha insertado, no debe manipular directamente el historial. git revert revertirá los cambios específicos de una confirmación utilizando una nueva confirmación, a fin de no manipular el historial de compromisos.

266

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

Si lo que desea es que los archivos modificados no es el auto-commit, puede utilizar --no-commit

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

que es el mismo que el -n

% git revert -n <commit hash> 
+6

También podría hacer 'git reset HEAD ~ 1 --soft' si ya revertió sin' -n' – Daniel

+1

Pero 'git reset HEAD ~ n' no resolverá la anulación de ningún commit no continuamente accesible desde la cabecera. La consulta es revertir cualquier compromiso en particular. – sangeethkumarp

Cuestiones relacionadas