如何重新设置-硬子目录?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (49)

想象一下下面的用例:我想摆脱Git工作树的特定子目录中的所有更改,而保留所有其他子目录的完整。

  • 我能做到git checkout .,但是添加稀疏签出排除的目录。
  • git reset --hard,但它不允许我对子目录执行此操作:Git重置-难。致命:不能用路径进行硬重置。

再次:为什么git不能通过路径进行硬/软重置?

  • 我可以使用git diff subdir | patch -p1 -R但这是一种很奇怪的方法。

对于这个操作,正确的Git命令是什么?

下面的脚本说明了这个问题。控件下面插入正确的命令。How to make files注释--当前命令将恢复文件a/c/ac它应该被稀疏结帐排除在外。注意我不要想要显式恢复a/aa/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开发者DuyNguyen的说法,他善意地实现了特性和兼容性开关,如预期的那样进行下列工作:

git checkout -- a

(在哪里a是要硬重置的目录)。原始行为可以通过

git checkout --ignore-skip-worktree-bits -- a
用户回答回答于

  • git checkout -- <path>不执行硬重置:它用分段内容替换工作树内容。
  • git checkout HEAD -- <path>对路径进行硬重置,将索引和工作树替换为HEAD承诺。

两个结帐表不要删除目标修订中删除的文件...

如果在工作树中有额外的文件,而Head中不存在这些文件,则git checkout HEAD -- <path>不会移除它们。

扫码关注云+社区