更新²:使用Git 2.23(2019年8月)时,有一个新命令
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
呢?