UPDATE: This will work more intuitively as of Git 1.8.3, see my own answer .如何git重置 - 一個子目錄?
想象一下下面的用例:我想擺脫我的Git工作樹的特定子目錄中的所有更改,使所有其他子目錄保持不變。
我可以做
git checkout .
,但git checkout . adds directories excluded by sparse checkout有
git reset --hard
,但它不會讓我做它的子目錄:> git reset --hard . fatal: Cannot do hard reset with paths.
我可以使用
git diff subdir | patch -p1 -R
反向修補當前狀態,但這是一個相當於wei這樣做的方式。
此操作的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 stash && git stash drop'怎麼樣? – CharlesB 2013-03-14 08:47:28
'git checkout -/path/to/subdir /'怎麼辦? – iberbeu 2013-03-14 08:49:22
@CharlesB:'git stash'不接受路徑參數... – krlmlr 2013-03-14 09:13:31