2012-03-02 18 views
565

Sé que Git rastrea los cambios que realizo en mi aplicación, y se mantiene hasta que confirme los cambios, pero aquí es donde estoy colgado:¿Cómo uso 'git reset --hard HEAD' para volver a una confirmación anterior?

Cuando quiero volver a un commit anterior que uso :

git reset --hard HEAD

Y Git devuelve:

HEAD is now at 820f417 micro 

¿Cómo entonces revertir los archivos en el disco duro de nuevo a esa confirmación anterior?

Mis próximos pasos fueron:

git add . 
git commit -m "revert" 

Pero ninguno de los archivos han cambiado en mi disco duro ...

qué estoy haciendo bien/mal?

+0

¿Qué quiere decir revirtiendo los archivos en el disco duro de nuevo a esa confirmación anterior? Si 820f417 es la confirmación deseada, los archivos ahora deben tener el contenido exacto en esa confirmación. – kennytm

+5

Si desea deshacer todos los cambios, después de 'git reset --hard', debe' git checkout '. – jweyrich

+7

Realmente no entiendo la idea de [duplicar] y luego hago una nueva pregunta, cuando las respuestas no son satisfactorias. Es una receta para desastres en términos de más duplicados ... –

Respuesta

648

En primer lugar, siempre vale la pena señalar que git reset --hard es un comando potencialmente peligroso, ya que descarta todos los cambios no confirmados. Por seguridad, siempre debe verificar que la salida de git status esté limpia (es decir, vacía) antes de usarla.

Inicialmente que dicen lo siguiente:

así que sé que Git seguimiento de los cambios que hago a mi solicitud, y se aferra a ellos hasta que confirme los cambios, pero aquí es donde yo estoy colgado:

En caso de que esto revele una suposición errónea, debería decir que esto no es correcto. Git solo registra el estado de los archivos cuando los etapa (con git add) o cuando crea una confirmación. Una vez que haya creado un compromiso que tenga sus archivos de proyecto en un estado particular, son muy seguros, pero hasta entonces, Git no está realmente "rastreando cambios" en sus archivos. (por ejemplo, incluso si hace git add para organizar una nueva versión del archivo, que sobrescribe la versión previamente escenificada de ese archivo en el área de transición.)

En su pregunta a continuación, ir a preguntar lo siguiente:

Cuando quiero volver a una confirmación anterior que utilizo: git git restablecer la cabeza y vuelve --hard: cabeza está ahora en 820f417 micro

¿Cómo puedo volver los archivos en mi disco duro a la confirmación anterior?

Si lo hace entonces git reset --hard <SOME-COMMIT> Git:

  • Haga su rama actual (típicamente master) volver al punto en el <SOME-COMMIT>.
  • Luego haga que los archivos en su árbol de trabajo y el índice ("área de ensayo") sean los mismos que en las versiones comprometidas en <SOME-COMMIT>.

HEAD puntos a su rama actual (o cometer actual), por lo que todo lo que git reset --hard HEAD va a hacer es tirar cualquier cambio no comprometidos que tiene.

Supongamos que el compromiso correcto al que desea volver es f414f31. (Puede encontrar que a través de cualquier navegador o git log historia.) A continuación, tiene algunas opciones diferentes dependiendo de exactamente lo que quiere hacer:

  • Cambiar la rama actual para apuntar a la mayor cometen en su lugar. Puedes hacerlo con git reset --hard f414f31. Sin embargo, esto está reescribiendo el historial de su sucursal, por lo que debe evitarlo si ha compartido esta sucursal con alguien. Además, los commits que realizó después de f414f31 ya no estarán en el historial de su rama master.
  • Crea una nueva confirmación que represente exactamente el mismo estado del proyecto que f414f31, pero simplemente agrega eso al historial para que no pierdas ningún historial. Puede hacer que el uso de los pasos sugeridos en this answer - algo así como:

    git reset --hard f414f31 
    git reset --soft [email protected]{1} 
    git commit -m "Reverting to the state of the project at f414f31" 
    
+0

git reset --soft HEAD @ {1} realmente arruinó mi repositorio local. Piensa que todos los archivos son ahora. ¿Qué hago ahora? –

+1

@Mark Longair: la respuesta que señala al final no es de usuario, sino que simplemente se reinicia. – MiniQuark

+3

@MiniQuark: Estoy usando la variante equivalente y ligeramente más corta que sugerí en los comentarios en la respuesta vinculada. –

137

ADVERTENCIA: git clean -f eliminará los archivos sin seguimiento, lo que significa que se han ido para siempre ya que no se almacenan en el repositorio. Asegúrese de que realmente desea eliminar todos los archivos sin seguimiento antes de hacer esto.


Intenta lo siguiente y git clean -f.

git reset --hard no eliminará los archivos sin seguimiento, donde git-clean eliminará los archivos del directorio raíz rastreado que no estén bajo el seguimiento de Git.

Alternativamente, como dijo @Paul Betts, debe hacer git clean -xdf (tenga cuidado, eso también elimina todos los archivos ignorados).

+2

Esto es lo que obtengo de la terminal: ** No elimino aplicaciones/vistas/relaciones/ No eliminé tmp/sessions/ No eliminé tmp/sockets/** No cambio. Hmm ... todo lo que hago parece no funcionar. No es tu culpa. –

+53

git clean -xdf es lo que quiere :) –

+0

Después de mucha prueba y errores en su mayoría, terminé creando una nueva aplicación y cargando todos los archivos manualmente desde una copia de seguridad. Realizo muchas copias de seguridad, pero realmente necesito aprender a confiar en git, es decir, necesito aprender a usar git mejor. –

Cuestiones relacionadas