ОБНОВЛЕНИЕ² : В 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
и хочу восстановить все ниже. РЕДАКТИРОВАТЬ : И я также не "знаю" 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
?