Ver un archivo eliminado en Git

104

Eliminé un archivo con Git y luego me comprometí, por lo que el archivo ya no está en mi copia de trabajo. Quiero ver el contenido de ese archivo, pero no restaurarlo realmente. ¿Cómo puedo hacer esto?

Colin Ramsay
fuente

Respuestas:

144
git show HEAD^:path/to/file

Puede usar un identificador de confirmación explícito o HEAD~npara ver versiones anteriores o si ha habido más de una confirmación desde que lo eliminó.

CB Bailey
fuente
6
Tenga en cuenta que path/to/filees la ruta completa desde la parte superior del proyecto (directorio superior del repositorio).
Jakub Narębski
1
Tengo fatal: Invalid object name 'HEAD^'.(tengo que mencionar que solo tengo "
Confirmación
1
Si la eliminación está organizada pero no confirmada, use HEAD en lugar de HEAD ^ (ya que existía en HEAD). Por ejemplo, pensé que necesitaba un archivo, así que lo agregué y me comprometí a guardar mi trabajo, luego lo eliminé cuando se me ocurrió una solución diferente. Para ver el archivo original antes de volver a comprometerme, hice git show HEAD: path / to / file
Tony Wickham
1
Creo que también vale la pena mencionar que esto solo funciona si el archivo se eliminó en la confirmación más reciente. Si el archivo se eliminó hace varias confirmaciones, deberá usar una de las otras respuestas.
jayhendren
50

Si se trata de un archivo que eliminó hace un tiempo y no desea buscar una revisión , puede usar (el archivo se nombra fooen este ejemplo; puede usar una ruta completa):

git show $(git rev-list --max-count=1 --all -- foo)^:foo

La rev-listinvocación busca todas las revisiones de foopero solo enumera una. Dado que rev-listenumera en orden cronológico inverso, lo que enumera es la última revisión que cambió foo, que sería la confirmación que se eliminó foo. (Esto se basa en la suposición de que git no permite que un archivo eliminado se cambie y, sin embargo, permanezca eliminado). No puede simplemente usar la revisión que rev-listdevuelve tal como está porque fooya no existe allí. Tienes que preguntar por el que está justo antes que contiene la última revisión del archivo, de ahí el ^in git show.

Luis
fuente
2
Es posible que deba cambiar el último foo a ./foo. Y para ellos que no usen bash, obtenga la identificación con "git rev-list --max-count = 1 --all - foo" y luego haga "git show 5824127a8d99576632a04ac2b5c2344bcf751967: ./ foo" con la identificación (524 .. es el id)
Dror
1
Buena respuesta. Tuve que usar ~ en lugar de ^. No estoy seguro de por qué. Y para que la gente lo tenga claro, 'foo' aquí debe ser un camino completo desde la raíz de git.
pedorro
Puede escribir **/foosi no conoce la ruta (esto funcionará para el comando rev-list pero no para el comando show. Sin embargo, con la confirmación del comando rev-list puede encontrar la ruta).
Nickolai
10

Dado que es posible que no recuerde la ruta exacta, puede obtener el sha1 de git log y luego simplemente emitir

 git cat-file -p <sha1>
pdeschen
fuente
5
En nombre de Samuel Slund : Una forma de encontrar la suma sha1 para usar arriba es: git whatchanged --no-abbrevque da una salida similar a git (o svn) log.
ruido sin