2012-01-18 15 views
39

Hice un cometió y volvió conGit revertir última confirmación y sacarlo de la historia

git revert HEAD^ 

simplemente git log

➜ git:(master) git log 
commit 45a0b1371e4705c4f875141232d7a97351f0ed8b 
Author: Daniel Palacio <[email protected]> 
Date: Tue Jan 17 16:32:15 2012 -0800 

    Production explanation 

Pero si lo hago git log --all que sigue apareciendo. Tengo que sacarlo de la historia, ya que tiene información sensible

git log --all 
commit 5d44355080500ee6518f157c084f519da47b9391 
Author: Daniel Palacio 
Date: Tue Jan 17 16:40:48 2012 -0800 

    This commit has to be reset 

commit 45a0b1371e4705c4f875141232d7a97351f0ed8b 
Author: Daniel Palacio 
Date: Tue Jan 17 16:32:15 2012 -0800 

    Production explanation 

¿Cómo se quita el commit 5d44355080500ee6518f157c084f519da47b9391 de la historia también?

+0

duplicado de [Git deshacer último compromiso] (http://stackoverflow.com/questions/927358/git-undo-last-commit) –

+0

@AdrianCornish: Es un buen comienzo, pero no ayuda con la "información confidencial" poco. –

+0

@KevinBallard - un reinicio de git --hard will? Asumiendo que no ha sido empujado a ninguna parte, si se apretó, todas las apuestas están desactivadas. –

Respuesta

46

En primer lugar, git revert es el comando incorrecto aquí. Eso crea un nuevo compromiso que revierte uno anterior. Eso no es lo que estás pidiendo. En segundo lugar, parece que desea revertir HEAD en lugar de HEAD^.

Si no ha llevado esto a ninguna parte, puede usar git reset --hard HEAD^ para descartar la última confirmación (esto también descarta los cambios no confirmados, por lo que debe asegurarse de no tener ninguno que desee guardar). Suponiendo que está de acuerdo con la información sensible que está presente en su copia y nadie más, ya está. Puede continuar trabajando y un git push posterior no enviará su confirmación incorrecta.

Si eso no es una suposición segura (aunque si no me encantaría saber por qué), entonces debe caducar sus reflogs y forzar una recolección de basura que recoge todos los objetos pendientes en este momento. Puede hacerlo con

git reflog expire --expire=now --expire-unreachable=now --all 
git gc --prune=now 

aunque esto solo debe hacerse si realmente lo necesita.


Si usted tiene empujado a su confirmación, a continuación, que está bastante fuera de suerte. Puede hacer un esfuerzo forzado para revertirlo de forma remota (aunque solo si el lado remoto lo permite), pero no puede eliminar el compromiso desde la base de datos del lado remoto, de modo que cualquiera que tenga acceso a ese repositorio lo puede encontrar si saber qué buscar

+2

Por supuesto, si * usted * tiene acceso al sistema de archivos del control remoto, puede simplemente limpiarlo de la misma forma que lo hizo con el local. – Cascabel

+0

el git reflog expirar no parece funcionar, aún podría acceder a esa confirmación si revisé el historial manualmente. De todos modos, decidí eliminar de manera segura todo el repositorio, la próxima vez lo implementaré desde un disco encriptado para no tener que pasar por esto. – daniel

+0

¿Y no sabes cómo hacer lo mismo, solo borras el historial de confirmaciones en el medio de la historia? –

4

Si no ha presionado sin embargo, la confirmación, puede simplemente:

git reset CABEZA --hard ~ 2

(CABEZA ~ 2 para quitar el original y comprometer su "Revert" commit).

Esto restablecerá su rama actual al punto en el historial antes de la confirmación que desea eliminar. Si esa confirmación no está en ninguna otra rama, no se enviará a su origen.

+0

Eso no ayuda con la parte de historia. El compromiso aún en la historia. – daniel

+1

En realidad, a partir de este momento, la confirmación no formará parte de tu rama actual, y eventualmente será eliminada por git gc. Si desea eliminar la confirmación en este momento, puede usar git gc para eliminarla ahora, o clonar el repositorio nuevamente; al clonar un repositorio, solo los commits alcanzables por alguna rama son clonados. –

27

Si no se preocupan por el commit, simplemente:

git reset --hard HEAD~ 

a soplar a la confirmación.

Si desea que los cambios estén en el directorio de trabajo, hacer:

git reset HEAD~ 

Dependiendo de lo que ha hecho con git revert, puede que tenga que cambiar los comandos anteriores.Revertir crea una nueva confirmación que revierte la confirmación que desea revertir. Entonces habrá dos commits. Es posible que deba hacer HEAD~2 para eliminarlos.

Tenga en cuenta que, por lo general, revertir es la forma más segura de, bueno, revertir los cambios. Pero aquí, dado que desea eliminar datos confidenciales, restablecer es el mejor enfoque.

5

Hay una buena solución here. Para borrar el último (arriba) se comprometen que puede hacer

git push [remote] +[bad_commit]^:[branch] 

donde [bad_commit] es la confirmación que [rama] Actualmente referencia o que si el [Poder] se comprueba a nivel local, también se puede hacer

git reset HEAD^ --hard 
git push [remote] -f 
-1

Para revertir los cambios y eliminar el historial en el repositorio remoto, esto funcionó para mí. 1. Para revertir una confirmación, intente restablecer git CABEZA^--hard en su sucursal local y 2. Para fuerza de empuje a la rama remota oportunidad git push origin + branch_name

Para más información lea esto posible https://ncona.com/2011/07/how-to-delete-a-commit-in-git-local-and-remote

+0

En caso de que no lo haya notado, acaba de decir exactamente lo mismo que las respuestas antiguas, mucho mejores, ya tienen. Por favor, lea [respuesta]. – Ajean

Cuestiones relacionadas