Guía9 min

git restore para coding agents: deshacer un path, no reset --hard

Resumen

git restore copia working tree (o index) desde una fuente. Default: index → disco. --staged: HEAD → index. Un agente no usa git reset --hard. Esta guía cubre restore de un path, --source, y por qué el man page aún dice experimental.

GitHub
Un solo archivo restaurado desde el index, el resto del working tree intacto

Qué resuelve

Esta pieza se queda en la decisión práctica: qué instalar, qué riesgo agrega y cómo aplicarlo sin romper operación.

El agente editó el archivo equivocado. El reflejo entrenado es git reset --hard. Eso tira todo el working tree. git restore tira paths. El man page: restaura paths del working tree con contenido de una fuente; si el path está trackeado y no existe en la fuente, lo borra para igualar.

Git documenta restore como experimental (el comportamiento puede cambiar). En la práctica es el comando correcto desde Git 2.23. reset sigue existiendo para mover HEAD.

No sustituye gitignore. El curso instalar un agente no cubre deshacer.

Tres restauraciones

QuieroComando
Descartar edits en disco, dejar indexgit restore -- path (fuente = index)
Sacar del index, dejar discogit restore --staged -- path (fuente = HEAD)
Ambos al HEADgit restore --staged --worktree -- path

Default sin --staged: working tree desde el index. Con --staged: index desde HEAD. --source=<tree> para otro commit.

Paths nombrados. Nunca git restore . en un harness autónomo salvo que el humano pidió “tirar todo”.

restore de un path vs reset hard

Lo que el agente no corre

  • git reset --hard
  • git checkout -- . (el viejo restore; fácil de confundir con cambiar de rama)
  • git restore de un untracked: no lo borra. Untracked se quita con git clean — otro comando, otro permiso.
  • restore de .env “para probar”: no.

--patch es interactivo: no en headless.

Si restore elimina un path porque no está en la fuente, es el diseño. Confirma con git status después.

Receta

git status
git restore -- src/lib/foo.ts
git status

Si el archivo debía volver al último commit y salir del stage:

git restore --staged --worktree -- src/lib/foo.ts

Worktrees: restore actúa en este worktree. No toca el principal.

status, restore path, status

FAQ

¿git checkout file? Deprecated para esto. restore.

¿Revert? Crea un commit inverso. Otra operación. No es restore.

¿Experimental? El man lo dice. Sigue siendo más seguro que hard reset.

¿Untracked? git clean -n primero (dry-run). clean -f solo con OK humano.

reset --hard además mueve HEAD si le pasas un commit. restore no mueve HEAD. Por eso es el undo de archivos, no de historia. El agente que “deshace el último commit” necesita reset --soft o revert — y eso es otro ticket.

Verificado 2026-09-03 contra git help restore (source, staged/worktree, experimental).