ATUALIZAÇÃO² : Com o Git 2.23 (agosto de 2019), há um novo comando
git restoreque 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 filescomentário - o comando atual restaurará o arquivo a/c/acque deveria ser excluído pelo checkout esparso. Observe que eu não quero restaurar explicitamente a/ae a/b, apenas "sei" ae 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 stashnão aceita um argumento caminho ...
git stash && git stash drop?