git ready

aprendiendo git de a un commit por vez
por Nick Quaranto, traducido por Matías Flores

recuperando un directorio

publicado el 18 Mar 2009

Es relativamente fácil recuperar un sólo archivo desde la historia del repositorio usando revert o reset, pero ¿cómo haríamos para recuperar un directorio entero?

La solución es simple:

git checkout <treeish> -- /path/to/dir

Este comando recuperará el directorio /path/to/dir desde el “treeish” especificado. Veamos un ejemplo:

Para empezar, eliminaremos un directorio y a continuación integraremos unos cuantos commits (a modo informativo, todo esto es parte de una rama real de Jekyll, el generador de blogs que se utiliza para generar este sitio).

Así quedaría la historia del repositorio:

Espero que el gráfico no sea demasiado confuso. Basicamente, nuestro commit quedó bastante abajo en la historia del repositorio, que es probablemente el caso más común cuando necesitamos recuperar un directorio. Antes que nada, debemos identificar el commit que tiene el directorio que queremos recuperar. En este caso, sabemos que el último commit fue el merge, y el commit anterior fue el que eliminó el directorio. Por lo tanto, el commit que queremos es el tercer commit en la historia, o HEAD~2. También podemos identificarlo con el nombre de la rama (test~2) o incluso como el SHA anterior a la eliminación del directorio (f46666d^).

Siempre que intentes hacer un checkout de un directorio desde una revisión en la cual el directorio no existe, te encontrarás con este lindo mensaje de error:

$ git checkout test~1 -- bin/
error: pathspec 'bin' did not match any file(s) known to git.

Entonces, hagamos el checkout desde la revisión correcta para poder por fin recuperar nuestro directorio perdido:

¡Buenísimo! Todo arreglado. A partir de aquí podemos trabajar con el directorio, o simplemente hacer un commit.

Si te encuentras en esta situación, tal vez quieras considerar revertir el commit, lo que recuperará también todos los archivos que han sido borrados. Sin embargo, no siempre es posible hacer esto, y en algunos casos puede que no sea la mejor opción.