git restore
的命令,可以实现此功能,请参见被认可的答案。
UPDATE: 自Git 1.8.3起,此功能将更加直观易用,请参见我的回答。假设以下使用场景:我想摆脱Git工作树中特定子目录中的所有更改,同时保留所有其他子目录不变。
我可以执行
git checkout .
,但是git checkout .添加了稀疏检出中排除的目录有
git reset --hard
,但是它不允许我对子目录进行操作:> git reset --hard . fatal: Cannot do hard reset with paths.
我可以使用
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 stash && git stash drop
怎么样? - CharlesBgit checkout -- /path/to/subdir/
是什么意思? - iberbeugit stash
命令不接受路径参数... - krlmlr