最佳答案
UPDATE2 : 对于 Git 2.23(2019年8月) ,有一个新的命令
git restore
可以完成这项工作,请参阅 接受的答案。
更新 : 从 Git 1.8.3开始,这将更加直观地工作,请参见 我自己的答案。
设想下面的用例: 我想要去掉 Git 工作树的特定子目录中的所有更改,而保留所有其他子目录的完整性。
我可以做 git checkout .
,但是 < a href = “ https://stackoverflow./questions/15251638/git-checkout-add-directory-) > git checkout. 增加稀疏 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