restaurar después de "git rm"

restaurar después de "git rm"

Inicialicé git repo some_dir_pathcon git init. Después de eso, decidí no incluir todos los archivos en el repositorio y publiqué git rm -f. Como pensé, eliminaría todos los archivos del repositorio de git, no del directorio en sí. Y ahora, esto some_dir_pathestá vacío, excepto el propio .git:

ls -aR some_dir_path:
.git:
branches  config  description  HEAD  hooks  index  info  objects  refs
...

Entonces, la pregunta es ¿hay alguna forma de recuperar los datos?
No tenía confirmaciones emitidas ni ramas antes git rm -fdesde las cuales restaurar.

Respuesta1

Como ninguno de los archivos se había confirmado, ahora están perdidos.

Si se hubieran cometido, se habría recuperado emitiendo

git reset --hard

Eso habría restaurado los archivos eliminados (y revertido cualquier cambio realizado en otros archivos) desde la última confirmación.

Ver también git reset --help.

Respuesta2

El git rmno ha sido comprometido, por lo que el procedimiento es bastante sencillo:

Punto de partida: se agrega un "un archivo":

$  git cat-file -p HEAD:onefile         
content...
$  cat onefile
content...

Ahora el git rm:

$  git rm -f onefile 
rm 'onefile'
$  ls        

El archivo realmente desapareció. El comando git no está confirmado. (La línea rm 'onefile'esproducción, ¡no es un comando!)

Los consejos son fáciles aquí y ahora: que no cunda el pánico, obtenga una visión general:

$  git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        deleted:    onefile

Entonces, siguiendo la pista:

$  git reset HEAD *
Unstaged changes after reset:
D       onefile

La eliminación pasó de no confirmada a no preparada.

$  git archive HEAD -o playback.tar
$  tar xf playback.tar --to-stdout
content...

Si git rmse compromete, git reset HEAD~se necesita a.

Si el repositorio está vacío después de solo git init, el git rmcomando es "seguro":

$  git rm * 
fatal: pathspec '*' did not match any files

La Q oculta lo que sucedió entre init y rm. ¿Debe haber sido git add?

información relacionada