2012-10-03 49 views
14

¿Se puede deshacer una confirmación anterior, que durante mucho tiempo se ha fusionado en su repositorio de git, a través de un comando git? ¿O tiene que deshacer manualmente todos los cambios realizados en esa confirmación?Deshacer un commit de git

+1

echar un vistazo a 'git commit --amend' a modifiy la última revert' cometer o 'git donde se puede ajustar el ID de la confirmación que desea recuperar. Youn puede ubicar la identificación del compromiso con 'git log' [Git Amend] (http://git-scm.com/book/es/Git-Basics-Undoing-Things) [Git Revert] (http: // gitready. com/intermediate/2009/03/16/rolling-back-changes-with-revert.html) – dasheddot

Respuesta

19

siempre puede revertir los cambios de un solo cometen haciendo:

git revert <commit-id> 

nota que esto crea una nueva cometer, simplemente aflojando los cambios

por ejemplo, git log --oneline

d806fc9 two 
18cdfa2 bye 
62c332e hello 
c7811ee initial 

decir que quiero para revertir los cambios en comprometerse 18cdfa2:

git revert 18cdfa2 

Ahora tenemos: git log -1 -p

commit fb9d6627a71636503fc9a1eb4f725937c783ecee 
Author: Seth <[email protected](none)> 
Date: Wed Oct 3 10:32:46 2012 +0200 

    Revert "bye" 

    This reverts commit 18cdfa27c964b66b624be1030250757b745d6866. 

diff --git a/a b/a 
index 0907563..3b18e51 100644 
--- a/a 
+++ b/a 
@@ -1 +1 @@ 
-bye world 
+hello world 
10

Siempre se puede hacer git revert <commit-hash> deshacer un git commit. Sin embargo, esto en la mayoría de los casos no es útil porque crea un nuevo compromiso que agrega a su glog.

Lo que suelo hacer cuando tengo que dar un paso atrás es reiniciar mi rama a una etapa anterior. Para hacer esto, haga un refrito de git y busque la posición HEAD a la que desea ir.

[email protected]:~/myrepo$ git reflog -3 
8d386b8 [email protected]{0}: commit: I did something I don't want 
2a59955 [email protected]{1}: commit: Feedback from PR #792 
1023102 [email protected]{2}: checkout: moving from one branch to another 

Ahora, decir que quiero pasar a comprometerse de hash 2a59955 y deshacer todos los cambios en 8d386b8. Haría:

Update: git reset --soft [email protected]{1} 

Esto restablecerá mi rama al estado inicial. Hacer esto no solo deshará todos los cambios, sino que también detendrá el seguimiento de todos los archivos que podría haber agregado en esta confirmación. Por supuesto, esta es la forma más eficiente de deshacer todos los cambios en una única confirmación.

Esto deshará todos los cambios. Hay un restablecimiento completo destinado a retroceder en el tiempo (al menos desde un punto de vista git). Utilice --hard en lugar de --soft para este

+1

Yo diría que es útil en parte * debido * al hecho de que crea una nueva confirmación. ¿Qué pasa si quieres deshacer tu deshacer? ¿Qué pasa si quieres saber más tarde que has revertido? Además, también se debe mencionar el compromiso + presionar, ya que el solo reinicio no cambia el historial de confirmaciones como tal. – eis

+0

Sí, no es así y acepto que también es importante tener un historial de confirmaciones revertidas. Restablecer ayuda cuando desea retroceder un paso y volver a empezar desde el último estado. Además, restablece las estancias en tus registros y no es como si borrases por completo la confirmación. – rizwaniqbal

+3

¡SUAVE! ¡Usas SOFT! Pierdes tus cambios con ese comando. Estaba buscando cómo deshacer un compromiso que comprometió demasiado (maldición, intellij) así que aquí hay una advertencia para el siguiente tipo. – cmp