2010-09-03 17 views
185

Con git log, obtengo una lista de confirmaciones que he hecho hasta ahora.¿Volver a una confirmación específica basada en la identificación de confirmación con Git?

commit f5c5cac0033439c17ebf905d4391dc0705dbd5f1 
Author: prosseek 
Date: Fri Sep 3 14:36:59 2010 -0500 

    Added and modified the files. 

commit c14809fafb08b9e96ff2879999ba8c807d10fb07 
Author: prosseek 
Date: Tue Aug 31 08:59:32 2010 -0500 

    Just simple test for core.editor. 

... etc ... 
  • ¿Cómo puedo volver de nuevo a un determinado comprometerse? Por ejemplo, ¿qué debo hacer si quiero volver al commit c14809fafb08b9e96ff2879999ba8c807d10fb07?

  • ¿Hay alguna otra forma mejor de volver a una confirmación específica con Git? Por ejemplo, ¿puedo poner alguna etiqueta de cada compromiso para recuperarla con la etiqueta?

+0

A pesar de que esta pregunta es en realidad mayor que la que es ahora marcado como un duplicado de, esa tiene una mejor respuesta. http://meta.stackexchange.com/questions/147643/should-i-vote-to-close-a-duplicate-question-even-though-though-its-much-newer-and-ha/147651#147651 –

+2

Esto es un ejemplo perfecto de cómo es f - k'd up git (de la respuesta de bwawok): * "... luego, si quisieras llevar esto a alguien que tenga la nueva historia, fallaría" *. ¿De qué sirve si no puedes volver a verificarlo en el repositorio remoto? Estoy absolutamente sorprendido de lo difícil que Git ha hecho operaciones simples. – jww

+1

@jww Literalmente he estado leyendo durante una hora sobre cómo volver a una confirmación anterior y todavía no sé la respuesta. Estás absolutamente en lo cierto, git hace las cosas más complicadas de lo que deberían ser. – robben

Respuesta

304

¿Quieres hacer retroceder tu repositorio a ese estado? ¿O solo quieres que tu repositorio local se vea así?

si lo hace

git reset --hard c14809fa 

que hará que su código local y la historia local a ser igual que fue en ese cometido. Pero si quisieras llevar esto a alguien que tenga la nueva historia, fallaría.

si lo hace

git reset --soft c14809fa 

Esto hará que sus archivos locales cambiaron a ser como lo fueron entonces, pero salir de su historia, etc. lo mismo.

Entonces, ¿qué es exactamente lo que quiere hacer con este reinicio?

Editar -

Puede agregar "etiquetas" a tu repositorio .. y luego volver a una etiqueta. Pero una etiqueta es realmente solo un acceso directo al sha1.

Puede etiquetar esto como TAG1 .. luego un git reset --soft c14809fa, git reset --soft TAG1, o git reset --soft c14809fafb08b9e96ff2879999ba8c807d10fb07 todos harían lo mismo.

+1

Necesitaba retroceder a ese estado. Pero es bueno saber que puedo tener la opción de 'verse así'. Gracias por hacérmelo saber. Por cierto, ¿qué opción es la predeterminada? ¿duro o suave? – prosseek

+1

@prosseek el valor predeterminado es en realidad mixto. --mixed Restablece el índice pero no el árbol de trabajo (es decir, los archivos modificados se conservan pero no se marcan para la confirmación) e informa lo que no se ha actualizado. Esta es la acción por defecto. Consulte http://www.kernel.org/pub/software/scm/git/docs/git-reset.html – bwawok

+0

@prosseek: Si los distintos modos de restablecimiento le resultan un tanto confusos, incluso después de leer la página del manual (¡con cuidado!) podría intentar esta otra pregunta http://stackoverflow.com/questions/2530060/can-you-explain-to-me-git-reset-in-plain-english – Cascabel

15

git reset c14809fafb08b9e96ff2879999ba8c807d10fb07 es lo que está buscando ...

+0

No tendrá que escribir todo el sha, solo un poco funcionará – bwawok

+31

@bwawok: ¡Pero es más rápido seleccionar y hacer clic medio y pegar que escribir incluso un abreviado SHA1! – Cascabel

+3

¿Un 'git push origin mybranch' causará la reversión del repositorio de origen? – javadba

2

Si quiere forzar la situación, que puede hacer:

git reset --hard c14809fafb08b9e96ff2879999ba8c807d10fb07 

que enviar de nuevo a la forma en que su clon de git parecía en el momento del check-in

+0

¿en qué casos necesitaría forzar? – jacoballenwood

+1

¿Qué significa "en el momento del checkin"? ambiguo. si lo hago "git restablecer --hard X" es el estado de recompra igual que antes o después de cometer X X cometer ... – nyholku

+0

git reset X. Esto --hard hacer retroceder el estado del repositorio como antes comprometerse X. hará que su código local y la historia local a ser igual que lo fue en esa confirmación. Pero entonces, si usted quiere empujar a este maestro local o remoto con maestro diferente historia, que fracasaría. Por lo tanto, será la única versión de lectura de su repositorio. –

117

creo, la respuesta de bwawok está mal en algún momento:

si lo hace

git reset --soft c14809fa 

Hará que sus archivos locales cambien para ser como eran entonces, pero deje su historial, etc. de la misma manera.

Según manual: git-reset, "git reset --soft" ...

no toca el archivo de índice ni el árbol de trabajo en absoluto (pero restablece la cabeza a <cometer>, al igual todos los modos lo hacen).Esto deja todos los archivos modificados "Cambios que se comprometerán", como lo indicaría el estado de git.

Por lo tanto, "eliminará" las nuevas confirmaciones de la sucursal. Esto significa que, después de mirar su código anterior, no puede acceder fácilmente a la nueva confirmación en esta rama. Entonces lo hace el oponente como lo describe bwawok: Los archivos locales no se modifican (se ven exactamente como antes "git reset --soft"), pero el historial se modifica (la rama se trunca después de la confirmación especificada).

El comando de respuesta de bwawok podría ser:

git checkout <commit> 

Usted puede usar esto para echar un vistazo a revisión antigua: ¿Cómo hizo mi mirada código de ayer?

(lo sé, debo poner esto en los comentarios a esta respuesta, pero stackoverflow no me permite para hacerlo! Mi reputación es demasiado baja.)

+1

un gran tipo con el que, sin embargo, una reputación baja :) – keni

+0

pero 'checkout' Git es de sólo lectura, por lo tanto, no se puede cometer una revisión antigua. – robben

+0

@Peter R: Después de "git reset --soft" seguido de "git checkout", no veo un cambio en un archivo que he estado trabajando. ¿Podría ser porque no estoy en la rama principal? – moonman239

Cuestiones relacionadas