2009-09-03 21:23:58 +0000 2009-09-03 21:23:58 +0000
133
133

¿Cómo puedo retroceder 1 compromiso?

Tengo 2 compromisos que no empujé:

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.

¿Cómo puedo retroceder el primero (el más antiguo), pero mantener el segundo?

$ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

Desde aquí: http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want

Sólo necesito hacer:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

Eso es…

Respuestas (9)

99
99
99
2009-09-03 21:32:01 +0000

La forma más segura y probablemente más limpia de hacerlo es rebasar interactivamente.

git rebase -i HEAD^^

O,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

A partir de ahí puedes aplastar las confirmaciones, lo que pone una o más confirmaciones juntas en la anterior. Para borrar completamente una confirmación del historial, borra la línea de la lista.

Puedes revertir una confirmación con git revert pero va a añadir más mensajes de confirmación al historial, lo cual puede ser indeseable. Usa el parámetro -n para decirle a Git que no confirme el reverso de inmediato. Puedes rebasar interactivamente y aplastarlas hasta una confirmación previa para mantener las cosas limpias.

Si las dos confirmaciones con las que estás trabajando aquí afectan al mismo archivo(s), puedes ver un conflicto de fusión.

El reinicio del repositorio con git reset --hard debe hacerse con cuidado, ya que no puede deshacerse.

La reescritura del historial debe hacerse con cuidado.

54
54
54
2011-08-05 17:52:58 +0000

Esto es de http://nakkaya.com/2009/09/24/git-delete-last-commit/ y me funcionó

Git Delete Last Commit

De vez en cuando, tarde en la noche, cuando me quedo sin café, cometo cosas que no debería. Luego paso los siguientes 10 o 15 minutos buscando en Google cómo eliminar el último compromiso que hice. Así que después de la tercera vez quise hacer un registro de ello para poder referirme a él más tarde.

Si has cometido basura pero no has presionado,

git reset --hard HEAD~1

CABEZA~1 es una abreviatura de la comisión antes de la cabeza. Alternativamente puedes referirte al SHA-1 del hash al que quieres resetear. Ten en cuenta que cuando usas –difícil cualquier cambio en los archivos de seguimiento en el árbol de trabajo desde la confirmación antes de la cabecera se pierden.

Si no quieres borrar el trabajo que has hecho, puedes usar la opción --soft que borrará la confirmación pero dejará todos tus archivos cambiados “Cambios a confirmar”, como diría el estado de git.

Ahora, si ya has empujado y alguien ha tirado, lo que suele ser mi caso, no puedes usar git reset. Sin embargo, puedes hacer un reverso del git,

git revert HEAD

Esto creará una nueva confirmación que revertirá todo lo introducido por la confirmación accidental.

8
8
8
2009-09-03 21:26:55 +0000

No. Git-reset… Hard te traerá de vuelta a la historia. Lo que buscas es git revert, que deshará cualquier compromiso.

6
6
6
2011-12-12 04:39:48 +0000

Acabo de hacer esto:

git rebase -i HEAD^^

Lo arruiné así que lo hice

git rebase --abort

Luego lo hice de nuevo. Luego tuve que empujar así:

git push origin master -f

Y destruyó los compromisos más nuevos que el compromiso al que había regresado. Funcionó muy bien.

4
4
4
2010-01-28 03:48:38 +0000

En referencia al comentario de Jtimberman sobre que git reset --hard es imposible, eso no es del todo cierto. Mira aquí: https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1

4
4
4
2009-09-03 21:46:37 +0000

No, git reset --hard baf8d5e borrará la confirmación 3368e1c y HEAD estará en baf8d5e después.

Si quieres mantener la confirmación 3368e1c y borrar la confirmación bad8d5e la solución más fácil es hacer un “git rebase -i HEAD~2” (es decir, un rebase interactivo de las dos últimas confirmaciones). Este comando lanzará tu editor de mensajes de confirmación y verás una línea para cada una de las dos últimas confirmaciones. Allí sólo tienes que borrar la línea de confirmación bad8d5e y guardar. git reescribirá entonces tu historial y la 2ª confirmación habrá desaparecido.

Hay otros comandos útiles que puedes usar en el editor de mensajes de confirmación como squash, edit, etc. El rebase interactivo es MUY poderoso!

¡No hagas esto si alguien ya ha visto estas confirmaciones (push o pull de tu repositorio)!

1
1
1
2012-10-12 09:23:13 +0000
git checkout <treeish> -- /path/to/dir

Eso traerá de vuelta el directorio de la “arboleda” dada para el /path/to/dir

1
1
1
2012-02-28 20:17:27 +0000
git reset --hard {ref}

es la única manera de deshacer una comisión si sólo hay otra comisión en el repo (por ejemplo, la comisión inicial y una más). El resto de las formas (revertir, rebase) se niegan a funcionar, al menos a partir de git 1.7.5.1.

Si sigues el git reset con un git gc entonces git borrará realmente los datos de la confirmación antigua del repositorio por completo.

0
0
0
2014-06-13 00:08:14 +0000

Conseguí que esto funcionara editando manualmente los códigos hash de las últimas confirmaciones de los archivos HEAD dentro de la carpeta del repositorio:

"centralRepository\refs\heads\master"
"centralRepository\refs\heads\branch2"

Antes de eso, nunca fui capaz de empujar al origen las operaciones UNMERGE que hacía localmente. Seguía diciendo que “no pudo empujar algunos refs” al Repositorio Central.