¿Cómo restaurar un directorio completo del historial del repositorio de git?

91

Me gustaría restaurar un directorio completo (de forma recursiva) del historial de mi repositorio de git.

Solo hay 1 rama (maestra).

Sé el compromiso donde se incluyeron los errores.

¿Puedo usar el hash sha1 de la confirmación principal para restaurar el estado del directorio tal como estaba antes de que se incluyeran los errores?

Pensé en algo como esto:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 path/to/the/folder/

Pero no funcionó.

más buscado
fuente
7
intente agregar '-' entre revisiones y rutas:git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/
Carlos Campderrós
esto ayudó. muchas gracias.
Most Wanted el
1
@ CarlosCampderrós Escribe eso como una respuesta real y acumula tus 15 puntos antes de que alguien más lo haga;)
ralphtheninja
@MagnusSkog No estaba seguro de que funcionaría, así que hice un comentario solo para verificar. Ahora que estoy seguro de que funciona, lo
anoté
2
Como sugerencia general, "no funcionó" no es muy útil. Díganos por qué no funcionó, idealmente con la salida de error (recortada si es muy larga).
yo_y

Respuestas:

156

intente agregar '-' entre revisiones y rutas:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/ 

Y si desea recuperar un directorio de la confirmación anterior, puede reemplazar el hash de confirmación por HEAD ~ 1, por ejemplo:

git checkout HEAD~1 -- path/to/the/folder/ 
Carlos Campderrós
fuente
mismo comando, propósito casi diferente: stackoverflow.com/questions/953481/…
cregox
18
Sin embargo, hay un problema: el OP no especifica si el directorio todavía existe. Para restaurar un directorio existente al estado de una confirmación, primero se debe eliminar el contenido del directorio. En otro caso, los archivos existentes que no existían en la confirmación anterior no se eliminarán.
Alberto
7
+1 @Alberto de acuerdo definitivamente. Hice una rm -Rf path/to/the/foldercontinuación git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/- Resultado: ese camino tenía exactamente los mismos archivos que en ese compromiso, no hay diferencias y no hay archivos adicionales que habían sido creados después de este cometido. Que es lo que quiero.
therobyouknow
2
que hace el --?
Ray Foss
2
@RayFoss le dice a git que los siguientes parámetros son archivos (de lo contrario, podrían confundirse con un hash de confirmación, una rama u otra cosa). Por lo general, no se necesitan pero no está de más ponerlos
Carlos Campderrós
3

Hay dos formas sencillas de hacer esto:

Si la confirmación que incluyó los errores solo incluyó los errores, utilice git revertpara invertir los efectos.

Si no, el camino fácil es este:

  1. git checkout 348…
  2. cp -a path/to/the/folder ../tmp-restore-folder
  3. git checkout HEAD # or whatever
  4. rm -rf path/to/the/folder
  5. mv ../tmp-restore-folder path/to/the/folder
  6. git add path/to/the/folder
  7. git commit -m "revert …"
Daniel Pittman
fuente
1

Si simplemente lo haces git checkout <SHA-ID> , lo moverá temporalmente a ese compromiso de sha.

Cada objeto de confirmación contiene la estructura completa del disco en ese momento, por lo que si tiene archivos allí y necesita copiarlos, puede hacerlo. Sin embargo, advierte que no estarás en ninguna rama, por lo que tendrás que regresar al maestro antes de copiar el archivo en tu árbol de trabajo y enviarlo.

Mark Fisher
fuente
re "volver al maestro" ¿te refieres al maestro de caja?
Pacerier