Restaurar una carpeta eliminada en un repositorio de Git

101

He eliminado todo el contenido dentro de una carpeta y la carpeta está vacía. Todavía tenía una copia en mi repositorio remoto. Pero cuando lo hice git pull, no se devolvieron los archivos eliminados, ¿no se supone que debe hacerlo?

Así que investigué un poco y vi que se puede revertir un archivo haciendo git checkout <revision> -- <name of file>

Pero eso solo funciona con archivos.

¿Cómo puedo recuperar todos los archivos dentro del directorio?

json2021
fuente
1
git statusle dará una pista sobre qué comando (s) ejecutar
Tavian Barnes
1
Parece que todavía tiene el directorio antiguo en su repositorio remoto (e incluso podría tenerlo también en su repositorio local). SUGERENCIA FUERTE: 1) Realice una "extracción" de su repositorio remoto a un NUEVO repositorio (no haga más daño a su repositorio local). 2) Pruebe "checkout" ... o incluso "revertir" en su nuevo repositorio local: atlassian.com/git/tutorials/undoing-changes/git-revert . 3) Actualice el repositorio remoto cuando esté seguro de que todo está bien.
paulsm4

Respuestas:

256

Todo lo que puede hacer con un archivo, también lo puede hacer con una carpeta.

También tenga en cuenta Buscar y restaurar un archivo eliminado en un repositorio de Git


Los archivos se eliminan del árbol de trabajo pero aún no se han confirmado:

Si aún no ha indexado ( git add) sus cambios, puede revertir el contenido de un directorio:

git checkout -- path/to/folder

Si la eliminación ya está indexada, primero debes restablecerla:

git reset -- path/to/folder
git checkout -- path/to/folder


Restaurar el árbol de trabajo completo (no una sola carpeta), pero perder todos los cambios no confirmados

git reset --hard HEAD


Cuando los archivos se eliminan en alguna confirmación en el pasado:

Encuentra la última confirmación que afectó a la ruta dada. Como el archivo no está en la confirmación HEAD, esta confirmación debe haberlo eliminado.

git rev-list -n 1 HEAD -- <file_path>

Luego, verifique la versión en la confirmación anterior, usando el ^símbolo de intercalación ( ):

git checkout <deleting_commit>^ -- <file_path>


Restaurar el árbol de trabajo completo desde un compromiso distante

git reset --hard <revision> 
Nick Volynkin
fuente
1
git checkout -- path/to/folder/* no funciona Nota: la pregunta es cómo restaurar una carpeta, no un archivo
gman
@gman How can I retrieve all the files inside the directorysignifica tanto el directorio como sus archivos. Pero el comando sorprendentemente no funciona para mí también. Recuerdo que lo hizo hace un año.
Nick Volynkin
2
@gman pero funciona como git checkout -- patho git checkout -- 'path/*'. En su ejemplo, elimina con lo git rmque el OP no parecía hacer. Agregué instrucciones para tal caso. ¡Gracias!
Nick Volynkin
3
En Windows, debe poner comillas como esta:git checkout "<deleting_commit>^" -- <file_path>
Maor
Deshizo un montón de cosas en todo el repositorio a pesar de que especifiqué una carpeta en el comando de reinicio. ¿Cómo esto tiene sentido? Cuando ejecuté el proceso de pago, parece que restauró mi carpeta. No tengo idea de lo que unstage le hizo al resto de mi código, ah, la alegría de un administrador de repositorio de igual a igual que se usa para repositorios centralizados, suspiro.
Paul Kenjora
5

Si aún no ha confirmado sus cambios, puede revertir el contenido o un directorio:

git checkout -- removed_directory

Si desea revertir todos los cambios, haga lo siguiente:

git reset --hard HEAD
Ivan Mushketyk
fuente
3
git checkout -- removed_directory no funciona
gman
git checkout -- removed_directoryfuncionó para mí, pero he creado este directorio antes (por checkoutuno de los archivos en ese directorio). Después de la creación, todos los archivos se restauraron en la carpeta con este comando.
Boolean_Type
5

Puede restaurar archivos o carpetas con git restore.

git restore --source master~1 "PATH_IN_YOUR_REPO"

Aquí, master ~ 1 revierte su carpeta a la revisión "1" desde su rama master.

Fuente: https://git-scm.com/docs/git-restore

jBelanger
fuente
4

Lo único que funcionó para mí fue verificar el repositorio en otra carpeta. Suponga que el repositorio actual está en /home/me/current.

Entonces hice

git clone /home/me/current /home/me/temp

Esto crea un clon separado del repositorio en /home/me/temp

Ahora puedo ir /home/me/tempy hacer lo que quiera. Por ejemplo

git reset --hard commit-hash-before-delete

Ahora puedo volver a copiar la carpeta de archivos eliminada

cp -r /home/me/temp/some/deleted/folder /home/me/current/some/deleted/folder

Y borra la carpeta temporal

rm -rf /home/me/temp

Los ejemplos de

git checkout -- some/deleted/folder
git checkout -- some/deleted/folder/*

NO FUNCIONAN

$ git checkout -- some/deleted/folder/*
zsh: no matches found: some/deleted/folder/*
$ git checkout -- some/deleted/folder
error: pathspec 'some/deleted/folder' did not match any file(s) known to git.

Otros ejemplos como

git reset --hard HEAD

son destructivos más allá de los archivos eliminados. Cualquier otro cambio también se perderá.

similar

git reset --hard some-commit

perderá cualquier compromiso después some-commit

gman
fuente
2

A partir de git 2.24.0, hay un nuevo comando git experimental: git restore

git restore --staged some/deleted/folder
es decir, tres
fuente
Me muestra git: 'restaurar' no es un comando de git
Ahmed C
0

Si no especifica un archivo específico, debería poder extraer el contenido completo de una confirmación específica. Como: git checkout 264794319e9695ba843cd6(asumiendo que el hash tiene todos sus archivos en el estado correcto).

La razón pullno es restaurar archivos es que git ve tus eliminaciones como el cambio más reciente, aplicándolo además de lo que estés extrayendo.

(Recomendaría experimentar en una nueva rama).

filosofo perdido
fuente
0

Si solo está buscando recuperar una carpeta eliminada y tiene otras confirmaciones después de la eliminación, también puede ir a su proyecto en github.com.

Desde github.com, vaya a su última confirmación que tiene su carpeta. Debería ver el mensaje de confirmación y a la derecha hay un botón con la etiqueta "Examinar archivos". Al hacer clic aquí, accederá a todos los archivos de esa etapa de la confirmación.

Desde allí, puede clonar el código o simplemente descargar el código como un zip.

stldoug
fuente
-1

para eliminaciones no comprometidas, es tan simple como esto:

git reset HEAD rel / ruta / a / eliminado / directorio / *

justadev
fuente