UPDATE² : З Git 2.23 (серпень 2019 року) є нова команда,
git restore
яка робить це, дивіться прийняту відповідь .ОНОВЛЕННЯ : Це буде працювати більш інтуїтивно, як у Git 1.8.3, дивіться мою власну відповідь .
Уявіть наступний випадок використання: Я хочу позбутися всіх змін у певному підкаталозі свого робочого дерева Git, залишивши всі інші підкаталоги недоторканими.
Я можу зробити
git checkout .
, але git checkout. додає каталоги, що виключаються за допомогою рідкої касиЄ
git reset --hard
, але це не дозволить мені зробити це для підкаталогу:> git reset --hard . fatal: Cannot do hard reset with paths.
Знову: Чому git не може робити жорсткі / м'які скидання шляхом?
Я можу змінити виправлення поточного стану за допомогою
git diff subdir | patch -p1 -R
, але це досить дивний спосіб зробити це.
Яка правильна команда Git для цієї операції?
Сценарій нижче ілюструє проблему. Вставте відповідну команду під How to make files
коментарем - поточна команда відновить файл, a/c/ac
який повинен бути виключений за допомогою розрідженої каси. Зауважте, що я не хочу явно відновити, a/a
і a/b
я лише "знаю" a
і хочу відновити все нижче. EDIT : І я також не знаю b
, чи які інші каталоги перебувають на тому самому рівні 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
не приймає аргумент шляху ...
git stash && git stash drop
?