在Git中,前一个版本的检出目录中的子目录不会消失?

3
我将尝试使用git checkout <hash> <directory>命令来检出我仓库中目录的前一个版本。这可以恢复目录中文件到以前的状态,但是,唯一的问题是,自从我检出的版本之后添加的子目录没有消失。

例如,如果我的目录结构如下所示:
HEAD:
thing/dir1/
thing/dir2/

HEAD^:
thing/dir1/

如果我执行 git checkout <hash>,那么我会进入分离 HEAD 模式,并且一切都匹配得很好。如果我执行 git checkout <hash> thing/,那么thing/dir1/的内容将恢复,但thing/dir2/将保持不变。
运行 git status 显示了来自 thing/dir1/ 的文件修改,但没有提及 thing/dir2/。这很奇怪,因为在 HEAD^ 的上下文中,thing/dir2/ 不应存在,因此应该消失。git clean 无法帮助,因为它甚至不会出现作为未跟踪的文件。
是否有一种方法可以检出以前版本的目录,使其完全匹配,而无需检出整个工作树?
更新:看起来这样可以解决问题:
git reset <hash> thing/
git checkout <hash> thing/
git clean -fd thing/

这会使我的工作树和索引处于奇怪的状态,但达到了预期效果。
2个回答

1

正如你已经提到的那样,git checkout <hash> 会使 git 进入 分离头指针模式。当检出特定文件时,只有文件被复制到您的工作目录中,其他所有内容都不受影响。

因此,thing/dir2/ 中的文件不会显示在 git status 中,因为它们处于 HEAD 的当前状态,而 thing/dir1 将显示修改后的文件。

如果您真的想要像上一个版本一样拥有整个 thing/ 文件夹,为什么不在之前将其删除呢?

rm thing/
git checkout <hash> thing/

我不确定它是否符合您的需求。请谨慎使用!(尽管当没有本地未提交的更改时,一切都应该可以恢复。)


听起来是个好主意,但当我尝试时,奇怪的是,thing/dir2 再次出现了。 - blorbx

1

来自http://git-scm.com/docs/git-checkout的说明:

更新工作树中的文件以匹配索引或指定的树中的版本。如果未给出路径,则git checkout还将更新HEAD以将指定的分支设置为当前分支。

在下面的内容中,它还说:

当给出 <paths> 或 --patch 时,git checkout 不会切换分支。它会从索引文件或命名的(通常是提交)中更新工作树中的命名路径。在这种情况下,-b和--track选项没有意义,并且给出其中任何一个都会导致错误。可以使用 tree-ish 参数来指定要在更新给定路径之前更新索引的特定树状对象(即提交、标签或树)。

换句话说,由于您没有切换分支,因此工作目录将不会反映对HEAD指针的任何更改,而是会显示属于tree-ish的文件,本例中为HEAD^。

thing/dir2仍然留在磁盘上的原因是它仍然属于当前HEAD(记住,HEAD没有移动),并且在树形结构中没有关于缺失部分(在这种情况下是thing/dir2)的信息。因此,实际上您已经将thing/dir1签出以反映HEAD^哈希的状态,并且thing/dir2也在磁盘上,因为它属于HEAD。

这很有道理,但有没有办法实现呢?我基本上想要将HEAD指针仅向后移动一个目录的效果。手动删除目录并按照另一个答案建议的进行检出似乎行不通。 - blorbx
你已经拥有了这个效果,thing/dir1的内容应该反映出你已经为此文件夹“移动”了HEAD。 - ralphtheninja
如果你真的需要 HEAD^ 的东西,你应该考虑在不使用路径参数的情况下进行检出。我不知道你想以另一种方式做这件事的原因。为什么不能只检出上一个提交呢?如果你真的需要 thing-subtree 与精确的提交匹配,而不必在 HEAD^ 上检出完整的存储库,那么你可能可以使用 git archive 并将其输出到另一个文件夹中。 - ralphtheninja
我正在使用单个git仓库来控制不同的设计库。如果能够将单个库检出为不同版本,那将非常方便。Git几乎可以管理这个问题,除了这个问题。 - blorbx
好的,看起来如果我真的想做这个,我需要先重置,然后检出,再清理。感觉有点脏,但是能用。不知道是否有更干净的方法... - blorbx
不要忘记你可以将其制作成脚本,然后你就有了一行代码 :) - ralphtheninja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接