ATUALIZAÇÃO² : Com o Git 2.23 (agosto de 2019), há um novo comando
git restore
que faz isso, veja a resposta aceita .ATUALIZAÇÃO : Isso funcionará de forma mais intuitiva a partir do Git 1.8.3, veja minha própria resposta .
Imagine o seguinte caso de uso: Quero me livrar de todas as alterações em um subdiretório específico da minha árvore de trabalho Git, deixando todos os outros subdiretórios intactos.
Eu posso fazer
git checkout .
, mas git checkout. adiciona diretórios excluídos pelo checkout esparsoExiste
git reset --hard
, mas não me permite fazer isso para um subdiretório:> git reset --hard . fatal: Cannot do hard reset with paths.
Novamente: Por que o git não pode fazer redefinições de hardware / software por caminho?
Posso fazer o patch reverso do estado atual usando
git diff subdir | patch -p1 -R
, mas essa é uma maneira bastante estranha de fazer isso.
Qual é o comando Git apropriado para esta operação?
O script abaixo ilustra o problema. Insira o comando apropriado abaixo do How to make files
comentário - o comando atual restaurará o arquivo a/c/ac
que deveria ser excluído pelo checkout esparso. Observe que eu não quero restaurar explicitamente a/a
e a/b
, apenas "sei" a
e quero restaurar tudo abaixo. EDIT : E eu também não "sei" b
, ou quais outros diretórios residem no mesmo nível 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
não aceita um argumento caminho ...
git stash && git stash drop
?