Restaurar archivo desde el antiguo commit en git

Respuestas:

222
git checkout 'master@{7 days ago}' -- path/to/file.txt

Esto no alterará HEAD, simplemente sobrescribirá el archivo local path/to/file.txt

Consulte man git-rev-parse para ver las posibles especificaciones de revisión allí (por supuesto, un simple hash (like dd9bacb) funcionará bien)

No te olvides de cometer el cambio (después de una revisión ...)

sehe
fuente
15
Wow, @heneryville y sehe, en realidad pensé que 'hace 7 días' era meta para que descubrieras qué cometer. ty!
AnneTheAgile 01 de
77
Parte 2 Cuando desee elegir una confirmación particular, el formato anterior no funciona. En su lugar, use lo que Urs mostró a continuación, git checkout commitShaNumber - ruta / a / file.txt por stackoverflow.com/questions/215718/…
AnneTheAgile
2
@AnneTheAgile, de hecho, sigue siendo exactamente la misma sintaxis, me acabo de dar un ejemplo "complejo" de revision-specificationque ya que eso es lo que el OP preguntó :)
sehe
1
Si su confirmación se usó para eliminar el archivo que está tratando de recuperar, simplemente use shacommit~1(ej . git checkout 0f4bbdcd~1 -- path/to/file.txt:) para obtener la confirmación inmediatamente antes.
sdlins
90
  1. Consulte el archivo de su antigua confirmación a través de git checkout [Revision_Key] -- path/to/file.
  2. Agregue, confirme, presione según corresponda.
Urs Reupke
fuente
3
git checkoutpuede manejar archivos individuales (ver respuesta de sehe), no es necesario copiar y pegar.
Koraktor
1
¿Las claves de revisión son siempre el SHA1 para la confirmación?
IslandCow
1
Lo son, pero generalmente los primeros 6 a 8 caracteres del SHA1 son suficientes para identificar la revisión.
Urs Reupke
2
@IslandCow no, que pueden ser sha1 sino también rama, etiqueta, o cualquier otra cosa que apunta a un comprometen, por ejemplo HEAD, ORIG_HEADo cualquiera de los que se combina con ^/ ~/ @notación de estilo.
Alois Mahdal
2
Indicas que se supone que uno debe "agregar" el archivo después. Pero eso es incorrecto. El archivo no se coloca en el área de ensayo. Ya está agregado.
xApple
9

Necesitaba restaurar un archivo reciente comprometido en git. Entonces, solo para reiterar y dar otra perspectiva, debe hacerlo ejecutando los siguientes dos pasos:

  1. git log -3
    Esto muestra las tres confirmaciones más recientes. Lea los comentarios y el nombre del autor para limitar la versión exacta que desea. Escriba esa identificación de confirmación larga (es decir, b6b94f2c19c456336d60b9409fb1e373036d3d71) para la versión de confirmación que desea.

  2. git checkout b6b94f2c19c456336d60b9409fb1e373036d3d71 - myfile.java
    Pase el id de confirmación Y el nombre del archivo que desea restaurar. Asegúrese de tener un espacio antes y después del guión doble.

Hay muchas otras formas de hacerlo. Pero este es el más simple que puedo recordar. Espero que ayude.

NOTA: Si está dentro de la ruta / carpeta de su proyecto, entonces no es necesario escribir la ruta completa del archivo en el comando de pago.

Salvador Valencia
fuente
El mejor comentario del mundo. Debido a que el que es la respuesta aceptada, supone que el archivo que debe recuperarse se envía en sentido ascendente, sin embargo, este comando recupera / restaura el archivo que solo existe localmente.
ot0
1
Acabo de probar esto en la carpeta raíz de mi repositorio local de git. Todavía necesitaba proporcionar la ruta relativa al archivo. Simplemente proporcionar el - [nombre de archivo] por sí solo no funcionó.
user2784627
@ ot0 No, no supone eso. Son exactamente la misma respuesta.
mate
4

Todas las respuestas mencionan git checkout <tree-ish> -- <pathspec>. A partir de git v2.23.0 hay un nuevo método de restauración de git que se supone que asume parte de lo que git checkoutfue responsable. Vea los aspectos más destacados de los cambios en el blog de Github .

El comportamiento predeterminado de este comando es restaurar el estado de un árbol de trabajo con el contenido proveniente del source parámetro (que en su caso será un hash de confirmación).

Asumiendo que el hash commit es abcdefel comando se vería así:

git restore --source=abcdef file_name

que (por defecto) lo coloca en el árbol de trabajo. Si desea colocar el cambio directamente en el índice para que se pueda confirmar de inmediato:

git restore --source=abcdef --worktree --staged file_name

o con nombres cortos de opciones:

git restore -s=abcdef -W -S file_name
mjarosie
fuente