Pregunta ¿Cómo uso 'git reset --hard HEAD' para volver a una confirmación anterior? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Sé que Git rastrea los cambios que realizo en mi aplicación, y los retiene hasta que confirme los cambios, pero aquí es donde estoy colgado:

Cuando quiero volver a una confirmación previa, uso:

git reset --hard HEAD

Y Git regresa:

HEAD is now at 820f417 micro

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

Mis próximos pasos fueron:

git add .
git commit -m "revert"

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

¿Qué estoy haciendo bien / mal?


644
2018-03-02 06:36


origen


Respuestas:


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

Inicialmente dices lo siguiente:

Así que 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:

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 creas un commit. 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 lo hace git add para crear 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, luego pasa a preguntar lo siguiente:

Cuando quiero volver a una confirmación anterior uso: git reset --hard HEAD Y git regresa: HEAD está ahora en 820f417 micro

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

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

  • Haga su sucursal actual (típicamente master) volver al punto en <SOME-COMMIT>.
  • A continuación, haga que los archivos en su árbol de trabajo y el índice ("área de ensayo") sean los mismos que las versiones confirmadas en <SOME-COMMIT>.

HEAD señala su rama actual (o la confirmación actual), entonces todo eso git reset --hard HEAD hará es tirar cualquier cambio no comprometido que tenga.

Entonces, supongamos que el compromiso bueno al que quieres regresar es f414f31. (Puedes encontrar eso a través de git log o cualquier explorador de historial.) Luego tiene algunas opciones diferentes según exactamente lo que quiere hacer:

  • Cambie su rama actual para apuntar a la confirmación más antigua en su lugar. Podrías hacer eso 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 hiciste después f414f31 ya no estará en la historia de su master rama.
  • Cree una nueva confirmación que represente exactamente el mismo estado del proyecto que f414f31, pero simplemente agrega eso a la historia, para que no pierdas ningún historial. Puedes hacer eso siguiendo los pasos sugeridos en esta respuesta- algo como:

    git reset --hard f414f31
    git reset --soft HEAD@{1}
    git commit -m "Reverting to the state of the project at f414f31"
    

733
2018-03-02 08:32



ADVERTENCIA: git clean -f eliminará los archivos no rastreados, 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.


Prueba esto y mira git clean -f.

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

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


147
2018-03-02 06:48