首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何git重置--硬化子目录?

如何git重置--硬化子目录?
EN

Stack Overflow用户
提问于 2013-03-14 16:40:36
回答 9查看 185.3K关注 0票数 240

UPDATE²:在Git2.23(2019年8月)中,有一个新命令git restore可以执行此操作,请参阅accepted answer

更新:从Git1.8.3开始,这将更加直观,请参阅my own answer

想象一下下面的用例:我想要删除Git工作树中特定的子目录中的所有更改,保留所有其他子目录不变。

我可以重置,但是git checkout . adds directories excluded by sparse checkout

  • There是硬的,但是它不允许我对子目录这样做:git reset --hard git

  • -- git checkout .。致命:无法使用paths.

进行硬重置

再说一遍:Why git can't do hard/soft resets by path?

  • 我可以使用git diff subdir | patch -p1 -R反向修补当前状态,但这是一种相当奇怪的方式。

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

下面的脚本说明了这个问题。在How to make files注释下插入适当的命令--当前命令将恢复稀疏签出应排除的文件a/c/ac。请注意,我不想显式地恢复a/aa/b,我只“知道”a,并希望恢复下面的所有内容。编辑:我也不“知道”b,也不知道其他哪些目录与a位于同一级别。

代码语言:javascript
复制
#!/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
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2013-03-14 16:51:15

有了Git2.23(2019年8月),你就有了new command git restore (也是presented here)

代码语言:javascript
复制
git restore --source=HEAD --staged --worktree -- aDirectory
# or, shorter
git restore -s@ -SW  -- aDirectory

这将使用HEAD内容替换索引和工作树,就像reset --hard一样,只是针对的是特定路径。

原始答案(2013)

请注意(作为Dan Fabulichcommented ):

  • git checkout -- <path>不做硬重置:它用暂存的contents.
  • git checkout HEAD -- <path>替换工作树内容,对路径执行硬重置,用HEAD提交的版本替换索引和工作树。

作为Ajedi32answered,两个签出表单都不会删除在目标修订中删除的文件。

如果你在工作树中有多余的文件,而这些文件在HEAD中并不存在,那么git checkout HEAD -- <path>就不会删除它们。

注意:使用git checkout --overlay HEAD -- (Git 2.22, Q1 2019)时,将删除出现在索引和工作树中但未出现在<tree-ish>中的文件,以使它们与<tree-ish>完全匹配。

但是,如"Why do excluded files keep reappearing in my git sparse checkout?“中所述,该签出可以遵守git update-index --skip-worktree (对于那些您想要忽略的目录)。

票数 234
EN

Stack Overflow用户

发布于 2013-05-16 22:00:27

根据友好地实现了the feature and a compatibility switch的Git开发人员Duy Nguyen的说法,下面的as of Git 1.8.3与预期的一样工作

代码语言:javascript
复制
git checkout -- a

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

代码语言:javascript
复制
git checkout --ignore-skip-worktree-bits -- a
票数 137
EN

Stack Overflow用户

发布于 2013-03-17 06:26:45

试着改变

代码语言:javascript
复制
git checkout -- a

代码语言:javascript
复制
git checkout -- `git ls-files -m -- a`

从1.7.0版本开始,Git的ls-files honors the skip-worktree flag

运行你的测试脚本(通过一些小的调整来改变git commit...到git commit -qgit statusgit status --short)输出:

代码语言:javascript
复制
Initialized empty Git repository in /home/user/repo/.git/
After read-tree:
a/a/aa
a/b/ab
b/a/ba
After modifying:
b/a/ba
 D a/a/aa
 D a/b/ab
 M b/a/ba
After checkout:
 M b/a/ba
a/a/aa
a/c/ac
a/b/ab
b/a/ba

使用建议的checkout更改输出运行测试脚本:

代码语言:javascript
复制
Initialized empty Git repository in /home/user/repo/.git/
After read-tree:
a/a/aa
a/b/ab
b/a/ba
After modifying:
b/a/ba
 D a/a/aa
 D a/b/ab
 M b/a/ba
After checkout:
 M b/a/ba
a/a/aa
a/b/ab
b/a/ba
票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15404535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档