example - Deshacer un commit particular en Git que ha sido empujado a repositorios remotos
git pull (3)
¿Cuál es la forma más sencilla de deshacer un compromiso en particular que es:
- no en la cabeza ni en la cabeza
- Ha sido empujado al mando a distancia.
Porque si no es el último commit,
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 la historia realmente. Si había un código malo, estaba allí en la historia y se puede ver. Solo quiero que salga en la copia de trabajo, y no me importa una confirmación de fusión inversa.
En otras palabras, ¿cuál es el equivalente de Git 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 mediante la fusión inversa de todos los cambios en esas revisiones, como un nuevo compromiso.
svn merge -c -302 ^/trunk
que deshace el compromiso 302, por supuesto, agregando otro compromiso que invierta fusiona los cambios de ese compromiso respectivo.
Pensé que debería ser una operación bastante simple en Git y un caso de uso bastante común. ¿Cuál es el punto de los atómicos cometidos?
Tenemos stashing escena y todo para garantizar que los compromisos sean perfectamente atómicos, ¿no deberías poder deshacer fácilmente uno o más de esos compromisos atómicos?
Debido a que ya ha sido empujado, no debes manipular directamente la historia. git revert
revertirá los cambios específicos de una confirmación usando una nueva confirmación, para no manipular el historial de confirmación.
Identifique el hash de la confirmación, usando el 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 le falta, el primero lo elimina de una rama que lo tiene.
No me gusta el auto-compromiso que hace git revert
, así que esto podría ser útil para algunos.
Si solo desea que los archivos modificados no sean la confirmación automática , puede usar --no-commit
% git revert --no-commit <commit hash>
que es lo mismo que el -n
% git revert -n <commit hash>