UPDATE²:在Git 2.23(2019年8月)中,有一个新的命令Git restore可以执行此操作,请参阅已接受的答案。
更新:从Git 1.8.3开始,这将更加直观地工作,请参阅我自己的答案。
想象一下下面的用例:我想去除Git工作树的特定子目录中的所有更改,而保持所有其他子目录不变。
我可以做git结帐。,但git结帐。添加被稀疏签出排除的目录 有git重置-很难,但它不让我做一个子目录: > git重置——很难。 致命:不能对路径进行硬复位。 再次:为什么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