ACTUALIZACIÓN² : con Git 2.23 (agosto de 2019), hay un nuevo comando
git restore
que hace esto, vea la respuesta aceptada .ACTUALIZACIÓN : Esto funcionará de manera más intuitiva a partir de Git 1.8.3, consulte mi propia respuesta .
Imagine el siguiente caso de uso: quiero deshacerme de todos los cambios en un subdirectorio específico de mi árbol de trabajo Git, dejando intactos todos los demás subdirectorios.
Puedo hacerlo
git checkout .
, pero git checkout. agrega directorios excluidos por pago escasoHay
git reset --hard
, pero no me deja hacerlo para un subdirectorio:> git reset --hard . fatal: Cannot do hard reset with paths.
Nuevamente: ¿por qué git no puede hacer restablecimientos duros / suaves por ruta?
Puedo revertir el estado actual usando
git diff subdir | patch -p1 -R
, pero esta es una forma bastante extraña de hacerlo.
¿Cuál es el comando Git adecuado para esta operación?
El siguiente script ilustra el problema. Inserte el comando adecuado debajo del How to make files
comentario: el comando actual restaurará el archivo a/c/ac
que se supone que está excluido por el pago escaso. Tenga en cuenta que no quiero restaurar explícitamente a/a
y a/b
solo "sé" a
y quiero restaurar todo lo siguiente. EDITAR : Y tampoco "sé" b
, o qué otros directorios residen en el mismo nivel que a
.
#!/bin/sh
rm -rf repo; git init repo; cd repo
for f in a b; do
for g in a b c; do
mkdir -p $f/$g
touch $f/$g/$f$g
git add $f/$g
git commit -m "added $f/$g"
done
done
git config core.sparsecheckout true
echo a/a > .git/info/sparse-checkout
echo a/b >> .git/info/sparse-checkout
echo b/a >> .git/info/sparse-checkout
git read-tree -m -u HEAD
echo "After read-tree:"
find * -type f
rm a/a/aa
rm a/b/ab
echo >> b/a/ba
echo "After modifying:"
find * -type f
git status
# How to make files a/* reappear without changing b and without recreating a/c?
git checkout -- a
echo "After checkout:"
git status
find * -type f
git checkout -- /path/to/subdir/
?
git stash
no acepta un argumento de ruta ...
git stash && git stash drop
?