2011-11-04 13 views
5

(Nota, no estoy buscando la respuesta git rebase -i)¿Cómo puedo "volver a abrir" un commit de git?

En mercurial, puedo "reabrir" una confirmación mediante su importación en mi cola de parche:

hg qimport tip 

La confirmación se "abra" en el sentido de que es como antes de haberlo cometido, puedo revertir, hago hg diff, hg status, etc. ¿Cómo hago esto en git?

(Todo lo que he encontrado en la web sugiere git rebase -i y luego elegir edición, pero eso es diferente, debido a que la cometen es no "abierta" de la misma manera.)

+0

La otra opción es dejar la confirmación allí, cambiar algunas cosas más, y luego usarlas para * modificar * la confirmación ('git commit --amend'). – Cascabel

Respuesta

16

sólo tiene que mover el puntero de su cabeza hacia arriba sin hacer ningún cambio a su copia de trabajo:

git reset --soft HEAD^ 

Restablecer mueve el puntero y la opción suave especifica que no debe cambiar cualquiera de sus archivos. El valor predeterminado es mixto, lo que restablecerá su índice, y la opción difícil eliminará los cambios desde que se confirma en su copia de trabajo.

HEAD es un puntero git "mágico" que siempre apunta a la referencia actual (es decir, el elemento principal de la copia de trabajo). El símbolo de intercalación (^) indica el padre. Puede usar esto repetidamente, p. HEAD ^^ se refiere al padre del último commit.

+0

¡Gran respuesta, gracias! ¿Podría anotar que pierde el mensaje de confirmación, como lo hizo @wulong? –

+0

Si realmente desea usarlo repetidamente, 'HEAD ^^^^^ 'es lo mismo que' HEAD ~ 5'. (Y más precisamente, 'HEAD' es una referencia simbólica, apuntando a la rama actualmente desprotegida, que apunta a la confirmación actualmente desprotegida, o directamente a una confirmación si se encuentra en estado HEAD separado, sin rama controlada out.) – Cascabel

+3

@PaulBiggar: evitar perder el mensaje de confirmación es una buena razón para modificar en lugar de restablecer. Sin embargo, si reinicia, aún puede recuperar indirectamente el mensaje de confirmación. 'HEAD @ {1}' se refiere a la confirmación previamente desprotegida, que (si no has hecho nada más) será la confirmación previa al restablecimiento. Puede usar 'git commit -c HEAD @ {1}' para usar su mensaje de confirmación como punto de partida. (Si ha movido HEAD desde entonces, puede usar 'git reflog' para encontrar el commit más atrás en los reflogs). – Cascabel

2

Suponiendo que no tiene todavía presionado a su repositorio remoto, git reset --soft HEAD^ "reabrirá" su última confirmación a expensas de perder su mensaje de confirmación.

2

Puede obtener el mismo resultado usando git commit --amend.

Ver comparison chart entre Hg & Git.