git recupera el archivo eliminado donde no se realizó ninguna confirmación después de la eliminación

812

Eliminé algunos archivos.

NO me comprometí todavía.

Quiero restablecer mi espacio de trabajo para recuperar los archivos.

Hice un git checkout ..

Pero todavía faltan los archivos eliminados.

Y git statusmuestra:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    cc.properties
#   deleted:    store/README
#   deleted:    store/cc.properties
#

¿Por qué no git checkout .restablece el espacio de trabajo HEAD?

Homan
fuente
16
si no hubiera organizado sus cambios después de la eliminación, git checkout .habría funcionado bien.
faizal
10
@faizal y perderá sus cambios si lo hace.
Vasiliy Yorkin
1
Simplemente presione Ctrl-J en git gui en el elemento eliminado.
ajeh
git checkout - cc.properties store / README store / cc.properties
Vinod Pasi
Vea esta respuesta: quora.com/…
live-love

Respuestas:

787

La salida te dice lo que debes hacer. git reset HEAD cc.propertiesetc.

Esto desestabilizará la operación rm. Después de eso, ejecutar una git statusvez más le indicará que necesita hacer una git checkout -- cc.propertiespara recuperar el archivo.

Actualización: tengo esto en mi archivo de configuración

$ git config alias.unstage
reset HEAD

que suelo usar para desengranar cosas.

Noufal Ibrahim
fuente
55
¿Cómo se hace esto para múltiples archivos eliminados? Ejecutar git reset HEAD <<nombre de archivo>> varias veces sería engorroso, ¿alguna forma eficiente de hacerlo?
SubSul
70
git reset HEAD \*y luegogit checkout -- .
Noufal Ibrahim
3
pero he modificado archivos
Jiang YD
@RauliRajande Es probable que su situación sea diferente de la descrita en la pregunta original.
Noufal Ibrahim
1
rm -r ./engines- ¡Uy! Ahora git reset engines; git checkout engines.
Kris
209

Ha organizado la eliminación, por lo que debe hacer lo siguiente:

git checkout HEAD cc.properties store/README store/cc.properties

git checkout . solo se retira del índice donde ya se ha realizado la eliminación.

CB Bailey
fuente
177

Solo haz git checkout path/to/file-I-want-to-bring-back.txt

seddonym
fuente
8
funciona solo si los archivos no se han confirmado y enviado.
mahen3d
23
No funcionó para mí, git dijo que no conoce ningún archivo con ese nombre, aunque se rastrea el archivo. Tampoco me comprometí, solo eliminé un archivo usando el menú contextual de netbeans por error.
Zelphir Kaltstahl
44
@Zelphir +1error: pathspec 'file.ext' did not match any file(s) known to git.
Ivan Borshchov
@ user3479125 Supongo que su archivo nunca se confirmó. ¿Qué git statusdice al respecto?
ki92
12
El estado de Git mostró que el "archivo depurado.ext" verde git checkout HEAD -- file.extayudó a restaurarlo.
Ivan Borshchov
144

Para recuperar todas las eliminaciones no preparadas a la vez, automáticamente, sin especificar cada ruta:

git ls-files -z -d | xargs -0 git checkout --

Para recuperar todas las eliminaciones por etapas a la vez, automáticamente, sin especificar cada ruta individual:

git status | grep 'deleted:' | awk '{print $2}' | xargs git checkout --
PaoloC
fuente
12
Accidentalmente eliminé más de 500 archivos y esto funcionó de maravilla porque también mantuvo todos mis cambios válidos (la primera línea es lo que usé). Gracias.
Guy Lowe
1
Accidentalmente eliminó todo el contenido de un repositorio justo después de una compilación exitosa. El primer comando salvó mi tocino.
MonaLisaOverdrive
2
Antes de que esto funcionara para mí, tenía que correr git status --long | grep 'deleted:' | awk '{print $2}' | xargs git reset HEAD --.
Ian Dunn
1
Muy útil, quería mantener los archivos no rastreados, pero deshacerse de los borrados y modificados, simplemente cambió -d a -m para manejar los modificados.
RaisinBranCrunch
55
Tenga en cuenta que esto no funciona si tiene espacios en los nombres / rutas de sus archivos. Creo git ls-files -d | sed -e "s/\(.*\)/'\1'/" | xargs git checkout --que funcionará
perejil72
79

Como está haciendo una git checkout ., parece que está intentando restaurar su rama al último estado de confirmación.

Puedes lograr esto con un git reset HEAD --hard

Advertencia

Hacer esto puede eliminar todas sus últimas modificaciones y desestabilizar sus modificaciones, por ejemplo, puede perder el trabajo. Se puede ser lo que quiera, pero echa un vistazo a los documentos para asegurarse.

Paul T
fuente
39
Woww !! Cuidado con esto !!!! Puede que tengas razón, pero alguien podría confundirse y hacer explotar todo su código. Sería genial si agrega una advertencia más grande.
santiagobasulto
3
Esto es exactamente lo que necesitaba. No explota todo el código, simplemente lo devuelve a su confirmación más reciente.
Andrew Hendrie
2
Terminé con cientos de archivos faltantes en un punto. Esta es la única forma práctica de solucionar el problema. ¡Gracias!
Jonathan Benn
66

si usaste

git rm filename

para eliminar un archivo entonces

git checkout path/to/filename

no funciona, así que en ese caso

git checkout HEAD^ path/to/filename

Deberia trabajar

Aurangzeb
fuente
2
Me gusta esta respuesta No hay duda de que solo afecta el archivo específico que eliminó. 1) git checkout path / to / filename 2) git checkout - path / to / filename
Ed of the Mountain
Excelente. git checkout HEAD^ path/to/filenamefuncionó para mí ya que no había comprometido el archivo.
Moisés Ndeda
29

Aquí está el comando que me ayudó en mi mac. Probé algunas de las otras soluciones, pero no me funcionaron.

Versión de Git en OSX Mavericks

mac-pro:main chris$ git version
git version 1.8.5.2 (Apple Git-48)

Mando

git checkout HEAD -- path/to/file/file.cc
Chris Hinshaw
fuente
19
git checkout HEAD -- client/src/pp_web/index.cljs
Dustin Getz
fuente
17

Si desea restaurar todos los archivos a la vez

Recuerde usar el punto porque le dice a git que tome todos los archivos.

Este comando restablecerá la cabeza y eliminará todos los cambios:

$ git reset HEAD . 

Luego ejecute esto para restaurar todos los archivos:

$ git checkout .

Luego, haciendo un estado de git, obtendrá:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Casper Wilkes
fuente
Esta es la solución más simple y funciona para un montón de archivos (digamos que ha eliminado varios archivos / carpetas). buen trabajo amigo +
Gkiokan
9

¿Puedes querer ver esto?

eso va para los casos en que usaste

git checkout -- .

antes de cometer algo

También es posible que desee deshacerse de los archivos creados que aún no se han creado. Y no los quieres. Con :

git reset -- .
Paulo Linhares - Packapps
fuente
No informó completamente la respuesta que copió. De hecho git checkout -- ., no ayuda a recuperar archivos borrados y es equivalente a lo que el autor de la pregunta trató: git checkout .. La parte que trabajan lata es el que no copiar: git checkout <file_path>.
Jean Paul
6

Encontré esta publicación mientras buscaba respuestas sobre cómo eliminar un archivo que fue eliminado en mi directorio de trabajo después de una fusión de la rama de otro. Todavía no se realizó ninguna confirmación después de la fusión. Como se trataba de una fusión en progreso, no pude volver a agregarlo usando:

$ git reset <commitid#-where-file.cpp-existed> file.cpp

Tuve que hacer otro paso además del restablecimiento para recuperar el archivo:

$ git checkout -- file.cpp
usuario2453404
fuente
4

Si no ha confirmado ningún cambio, todo lo que tiene que hacer es guardar esos cambios y volverá a la última confirmación de trabajo.

git stash
git stash clear
git clean 
Almiar
fuente
Ponerlo en la pila de alijo no es una solución. Es un hack.
Robert Dolca
2
Esta es una buena solución porque puedes eliminarla del alijo. Si es un truco o no, es cuestión de gustos. Toda la idea de escondite es un truco inteligente.
Eino Mäkitalo
@ EinoMäkitalo me alegro de que pueda ser de ayuda para usted :)
Rick
Me gusta este enfoque mejor de todos los enumerados
ckapilla
3

Si está buscando un directorio eliminado.

 git checkout ./pathToDir/*
PPB
fuente
3

Aquí hay diferentes casos como referencia para ayudar a otros:

Si la eliminación no se ha confirmado , el siguiente comando restaurará el archivo eliminado en el árbol de trabajo.

$ git checkout -- <file>

Puede obtener una lista de todos los archivos eliminados en el árbol de trabajo utilizando el siguiente comando.

$ git ls-files --deleted

Si la eliminación se ha confirmado , busque la confirmación donde sucedió y luego recupere el archivo de esta confirmación.

#find the commit hash where it had this file deleted
$ git rev-list -n 1 HEAD -- <file>

Debería darte algo como c46e81aa403ecb8a0f7a323a358068345, ahora usa commit # aquí

$ git checkout <commit>^ -- <file>

Algo como esto: $ git checkout c46e81aa403ecb8a0f7a323a358068345 -

En caso de que esté buscando la ruta del archivo para recuperar, el siguiente comando mostrará un resumen de todos los archivos eliminados.

$ git log --diff-filter=D --summary

Si solo desea mostrar la lista de archivos:

git log --diff-filter=D --summary | grep "delete mode"
Muhammad Soliman
fuente
2

Para mí lo que funcionó fue git checkout {SHA1 of commit with version to restore} "{path to file to restore}"

Por ejemplo git checkout 5a6b3179e58edff9c90326b9a04284b02fd67bd0 "src-ui/views/includes/radar.pug"

(ejecutado en la rama en la que queremos que entre el archivo)

Después de que se ejecute ese comando, el archivo restaurado existirá en la ubicación original (que deberá ser comitado)

Dinis Cruz
fuente
y / o simplemente a git checkout master path/to/the/file.binpara que pueda recuperar ese archivo sin perder ningún otro cambio que haya hecho. PD: esta debería ser la respuesta aceptada ...
Edoardo
1

Si ha instalado ToroiseGIT, simplemente seleccione el elemento de menú "Revertir ..." para el menú emergente de la carpeta principal.

Vasyl Shyrochuk
fuente
1

1.Encuentre esa confirmación particular a la que desea revertir usando:

   git log
This command will give you a list of commits done by you .

2.Vuelva a esa confirmación usando:

    git revert <commit id> 

Ahora su sucursal local tendría todos los archivos en particular

Ashutosh S
fuente
Esto funciona si ya ha confirmado sus cambios.
live-love
1

PRECAUCIÓN: cometa cualquier trabajo que desee retener primero.

Puede restablecer su espacio de trabajo (y recuperar los archivos eliminados)

git checkout ./*
Henrique Florêncio
fuente
2
FYI ... este comando eliminó todos mis archivos de trabajo y no recuperó el archivo eliminado ... tenga cuidado
hendr1x
Es por eso que usa este comando para RESTABLECER su espacio de trabajo. Pensé que eso se explicaría por sí mismo.
Henrique Florêncio
1
Ese comando no funciona porque si se elimina el archivo, no será capturado por él ./*.
Jean Paul
@JeanPaul tal vez estoy malentendido, pero puso mi espacio de trabajo en el estado original (el archivo eliminado ahora está presente).
Marc
@Marc Podría funcionar, pero solo si no hay un archivo visible en el directorio, porque ./*bash se expandirá para que coincida con esos archivos antes de enviarlos a git.
Jean Paul
0

Tuve el mismo problema, sin embargo, ninguna de las soluciones anteriores funcionó para mí. Lo que terminé haciendo fue:
- crear un archivo vacío con el mismo nombre
- comparar este archivo con su historial local
- copiar el historial en un archivo vacío.

theEUG
fuente
-1

Tuve el mismo problema y ninguna de las respuestas que probé funcionó para mí tampoco. Estoy usando Intellij y había revisado una nueva rama git checkout -b minimalExamplepara crear un "ejemplo mínimo" en la nueva rama de algún problema al eliminar un montón de archivos y modificar un montón de otros en el proyecto. Desafortunadamente, aunque no confirme ninguno de los cambios en la nueva rama "ejemplo mínimo", cuando revisé mi rama "original" nuevamente, todos los cambios y eliminaciones de la rama "ejemplo mínimo" habían sucedido en la " original "rama también (o eso parecía). De acuerdo con git statuslos archivos eliminados, simplemente desaparecieron de ambas ramas.

Afortunadamente, a pesar de que Intellij me había advertido que "eliminar estos archivos puede no ser completamente recuperable", pude restaurarlos (en la rama de ejemplo mínima de la que realmente se habían eliminado) haciendo clic derecho en el proyecto y seleccionando Historial local > Mostrar historial (y luego Restaurar en el elemento de historial más reciente que quería). Después de que Intellij restauró los archivos en la rama "ejemplo mínimo", empujé la rama al origen. Luego volví a mi sucursal local "original" y corrí git pull origin minimalExamplepara recuperarlos también en la sucursal "original".

geneSummons
fuente