HOWTO · Git
Revertir un archivo a un commit anterior en Git
Aprende a restaurar un archivo con seguimiento desde un commit anterior de Git con git restore o git checkout, a inspeccionar el resultado y a decidir si prepararlo y confirmarlo en un commit.
En esta página
Para restaurar un archivo versionado desde un commit anterior, busca el commit que contiene la versión que necesitas y ejecuta git restore --source <commit> -- <file-path>. Esto actualiza el archivo en el árbol de trabajo sin cambiar el historial de commits y, de forma predeterminada, deja sin preparar la versión restaurada. Antes, revisa o guarda los cambios locales importantes: la restauración reemplaza el contenido del archivo en el árbol de trabajo. Si quieres incluir la versión restaurada en un nuevo commit, prepárala y crea el commit después.
Encuentra el commit que contiene la versión que quieres
Usa git log --oneline -- <file-path> para ver los commits que modificaron el archivo e identificar aquel cuya versión quieres recuperar. Por ejemplo, si README.md está en la raíz del repositorio, ejecuta git log --oneline -- README.md. El marcador -- señala el final de las opciones del comando; resulta útil cuando una ruta podría interpretarse como una opción. En git log, la ruta puede ser relativa al directorio actual. También puedes indicar una ruta relativa a la raíz del repositorio con la sintaxis de rutas :(top) de Git, por ejemplo, :(top)README.md.
Lee el resumen del commit y, si hace falta, inspecciona el archivo en un commit candidato con git show <commit>:<file-path>. En este formato, la ruta después de los dos puntos siempre es relativa a la raíz del repositorio, independientemente del directorio actual. Por ejemplo, si ejecutaste git log --oneline -- README.md desde el subdirectorio docs para encontrar cambios en docs/README.md, inspecciona esa versión con git show <commit>:docs/README.md. Para un README.md ubicado en la raíz del repositorio, usa git show <commit>:README.md, tanto desde la raíz como desde un subdirectorio. Usa en el comando de restauración el identificador del commit que muestra el registro, abreviado o completo. Un commit puede contener la versión que buscas aunque otros commits hayan modificado el mismo archivo después; elige según el contenido que quieras recuperar, no solo por cuál entrada es la más reciente.
Restaura un archivo desde un commit anterior
Primero inspecciona o guarda los cambios importantes que haya en el archivo. Después, restaura la versión elegida con git restore --source <commit> -- <file-path>. En el ejemplo proporcionado, el comando es git restore --source 9cbe84d -- README.md. Sustituye el commit y la ruta por los valores de tu repositorio. Este comando copia al árbol de trabajo la versión del archivo registrada en ese commit. No crea un commit ni mueve la rama actual y, de forma predeterminada, el contenido restaurado no queda preparado.
Estos fragmentos muestran operaciones de Git, pero no incluyen una salida de ejecución afirmada; su efecto depende del historial del repositorio y del estado actual del índice y del árbol de trabajo. Después de restaurar, usa git diff -- <file-path> para revisar el cambio en el árbol de trabajo. Si también tienes cambios preparados para esa ruta, inspecciona la versión preparada con git diff --cached -- <file-path> para saber qué se incluiría en el próximo commit.
Elige entre git restore y git checkout
Para recuperar un archivo de un commit elegido, git restore --source <commit> -- <file-path> indica explícitamente el commit de origen y actualiza el árbol de trabajo sin preparar el resultado de forma predeterminada. La alternativa con la forma de ruta es git checkout <commit> -- <file-path>. Este formato actualiza tanto el archivo del árbol de trabajo como el índice, por lo que la versión restaurada queda preparada de inmediato. La diferencia importa al preparar un commit: después de git checkout, revisa el cambio preparado; después de git restore, prepara el archivo tú mismo solo si eso es lo que quieres.
Ambas formas reemplazan el contenido actual del archivo en el árbol de trabajo. Guarda o inspecciona los cambios locales antes de ejecutar cualquiera de los comandos, especialmente si aún no están registrados en otro lugar mediante un commit. Restaurar un archivo no crea un commit; cambia el estado desde el que puedes continuar trabajando. El historial de la rama permanece igual hasta que hagas un commit más adelante.
Prepara y confirma el archivo restaurado
Después de git restore, revisa el cambio y, si quieres incluirlo en un commit, prepara el archivo con git add -- <file-path>. Luego comprueba git diff --cached -- <file-path> para confirmar qué versión quedará preparada y crea un commit con un mensaje que explique por qué restauraste el archivo. Si todavía no quieres registrar la restauración, déjala como un cambio en el árbol de trabajo.
Después de usar la forma de ruta git checkout <commit> -- <file-path>, la versión restaurada ya está en el índice. Revísala con git diff --cached -- <file-path> antes de crear un commit. Según lo que quieras hacer a continuación, puedes editar el archivo, preparar esos cambios o quitar la ruta del índice sin cambiar el contenido del árbol de trabajo. Restaurar un archivo no te obliga a crear un commit; tampoco publica ni comparte el cambio automáticamente.
Comprende git revert y git reset para archivos
git revert y restaurar un archivo resuelven problemas distintos. git revert <commit> crea un nuevo commit que invierte los cambios introducidos por un commit anterior; se usa para deshacer un commit y conservar el historial existente. No sirve para copiar un solo archivo de un commit anterior. Para recuperar una versión de un archivo, sigue el flujo de restauración desde un commit descrito antes y luego decide si quieres crear un commit con ese resultado.
La forma de ruta git reset HEAD -- <file-path> quita esa ruta del índice: hace que el índice coincida con HEAD, pero deja intacto el contenido del archivo en el árbol de trabajo. No restaura el contenido desde un commit elegido. Para descartar cambios del árbol de trabajo y devolver un archivo a la versión actual de HEAD, git restore -- <file-path> lo restaura desde HEAD de forma predeterminada. Este comando también reemplaza el contenido del árbol de trabajo, así que primero revisa o guarda los cambios. La forma antigua de ruta git checkout -- <file-path> tiene un efecto similar al descartar cambios, pero no permite elegir un commit anterior. Usa la forma explícita --source <commit> cuando la versión deseada provenga de un commit concreto.
Para más detalles, consulta la documentación de Git restore, la documentación de Git checkout y el capítulo de Pro Git sobre cómo deshacer cambios.