HOWTO · Git

Cómo deshacer rm en Git

Aprende a recuperar un archivo eliminado con git rm, tanto si la eliminación aún está en el área de preparación como si ya se confirmó. Elige un comando de Git seguro para restaurar la versión deseada desde el índice o desde un commit.

En esta página

Para deshacer git rm, comprueba primero si la eliminación aún está en el área de preparación o ya se confirmó. Antes de un commit, restaura la ruta desde HEAD; después de un commit, selecciona un commit que contenga la versión que quieres y restaura la ruta desde él. Git puede recuperar versiones confirmadas, pero no puede recrear contenidos de archivos que nunca se confirmaron.

Qué cambia git rm

git rm <path> elimina un archivo rastreado del árbol de trabajo y prepara su eliminación en el índice. Por lo tanto, la eliminación está lista para incluirse en el siguiente commit. El comando rm no es un alias de git remove; rm es un comando de la shell, mientras que git rm también actualiza el índice de Git.

Usa git rm --cached <path> cuando quieras que Git deje de rastrear un archivo conservando su copia en el árbol de trabajo. Esto prepara la eliminación del índice y deja el archivo en el disco. Se usa a menudo cuando un archivo debe permanecer local pero dejar de pertenecer al repositorio.

Restaurar una eliminación antes de confirmar

Si la eliminación está en el área de preparación y quieres la última versión confirmada, restaura la ruta desde HEAD tanto en el índice como en el árbol de trabajo con git restore --source=HEAD --staged --worktree -- <path>. Comprueba que tu instalación de Git proporcione git restore antes de usarlo. Si no lo hace, git checkout HEAD -- <path> restaura esa ruta desde HEAD en el índice y el árbol de trabajo.

Estos comandos recuperan la versión confirmada, no las ediciones que existían solo en el árbol de trabajo. Inspecciona primero cualquier cambio preparado o local de la ruta, porque restaurar ambas ubicaciones reemplaza esa ruta por la versión seleccionada. Para restaurar varias rutas, enumera cada una después de --.

Este ejemplo autónomo crea un repositorio temporal, confirma una nota, prepara su eliminación y restaura la versión confirmada. La última línea es el contenido del archivo restaurado.

set -eu
repo_dir="$(mktemp -d)"
trap 'rm -rf "$repo_dir"' EXIT
cd "$repo_dir"
git init -q
git config user.name "Example User"
git config user.email "example@example.invalid"
printf 'A tracked note.\n' > notes.txt
git add notes.txt
git commit -qm "Add note"
git rm -q notes.txt
if git restore --source=HEAD --staged --worktree -- notes.txt 2>/dev/null; then
  :
else
  git checkout HEAD -- notes.txt
fi
cat notes.txt

Salida estándar esperada:

A tracked note.

Recuperar una eliminación después de confirmar

Después de que un commit registre la eliminación, elige un commit que contenga la versión del archivo que deseas. Luego restaura solo esa ruta con git restore --source=<commit> --staged --worktree -- <path>. Si git restore no está disponible, usa git checkout <commit> -- <path>. Sustituye <commit> y <path> por el commit seleccionado y la ruta relativa al repositorio.

Restaurar una ruta no deshace el commit que la eliminó; crea una restauración del archivo en el área de preparación que puedes revisar y confirmar. No supongas que HEAD~1 es la fuente correcta: pueden existir commits posteriores, y el commit inmediatamente anterior puede no contener la versión que necesitas.

Encontrar una versión anterior con el historial de Git

Usa git log --all -- <path> para inspeccionar los commits que cambiaron la ruta e identificar uno que contenga la versión deseada. git reflog registra las posiciones recientes de las puntas de rama y puede ayudar a localizar un commit después de un movimiento de rama, como un reset. No almacena contenidos de archivos por separado; el commit que selecciones debe contener la versión del archivo que quieres.

Una vez que identifiques un candidato, verifica que incluya la ruta y luego restaura esa ruta desde el commit candidato con el comando anterior. El historial de Git solo ayuda cuando los contenidos se confirmaron. Si el archivo nunca se confirmó, comprueba en su lugar las copias de seguridad del editor, las copias del sistema u otras copias.

Elegir un método de recuperación seguro

Usa el estado del repositorio para elegir la fuente: restaura desde HEAD para una eliminación preparada sin confirmar, o desde un commit anterior concreto para una eliminación ya confirmada. Revisa el diff preparado y el estado del árbol de trabajo antes de confirmar el archivo recuperado, especialmente si tienes otro trabajo en la misma ruta.

Evita git reset --hard como forma rutinaria de recuperar un archivo. Restablece el índice y el árbol de trabajo y puede descartar cambios no confirmados sin relación. Restaurar una sola ruta desde un commit elegido es más preciso. Para varios archivos, proporciona cada ruta al comando de restauración y revisa los cambios resultantes antes de confirmar.