Git Stashes 存储在哪里?

28

我一直在使用PhpStorm,最近存储了一堆更改。之后的某个时间点,我的电脑配置文件损坏并需要重建。

现在我有了一个新的电脑配置文件,但PhpStorm没有显示我的存储更改。

有什么方法可以找回它们吗?


3
你查看了文档吗?Stash 本地保存在 refs/stash。你是否曾在你的电脑上看到别人的存储?我想不会。你试过推送一个存储吗?这是不可能的。当你的本地仓库克隆消失时,你的存储也会消失。 - Daniel W.
3个回答

28

根据文档,最新的版本存储在./.git/refs/stash中,而旧版本则存储在该refreflog中。

此外,我发现保持常规使用git stash是一种不良实践。通常更喜欢在功能分支上进行多个小提交。这样你很少需要stash,当你需要stash时,只有很少的内容被保存。我通常只在需要暂时离开某些修改时才会stash,然后在完成查看后应用它们。

https://git-scm.com/docs/git-stash


17
"git stash"所存储的实际数据(即工作树的当前版本和.git/index的内容)被存储为两个提交树。
一个提交树包含了工作树当前状态的快照。这里有一些棘手的地方,请参见下文。
另一个提交树据我所知,用于存储在存储时.git/index的内容的快照。我还没有深入研究这个问题,尚不清楚一个是如何转化为另一个的。 .git/refs/stash包含了存储创建存储时的提交树的哈希值。 .git/logs/refs/stash包含了关于.git/refs/stash中存储之前存储的类似于reflog的元数据块。 .git/index保存了工作树中每个文件的条目列表。这些条目包含了完整的路径和文件名,以及关于文件的缓存元数据,包括文件系统元数据和与git相关的元数据。
"git add"既将文件的副本添加到对象存储中,又在.git/index中设置该文件的暂存标志。
对于"git stash"来创建一个提交树,已经被修改但尚未通过"git add"暂存的文件需要被添加到对象存储中。"git stash"通过构建一个临时索引文件来实现这一点。

2
我的 Mac 上运行的 Git 2.22 没有 .git/refs/stash 文件,但是我在 .git/logs/refs/stash 中列出了它们所有。 - Tamlyn
1
@Tamlyn 一个不存在的.git/refs/stash意味着你当前没有任何东西在暂存区:git stash list不会显示任何内容。它的reflog存在的事实表明你曾经暂存过一些东西,但你必须已经删除或弹出了它。 - Eph

6
所有的内容都存储在.git/refs/stash中,git stash会永久保存stash,并且git stash list会列出所有的stash。
请注意,删除或清除stash会将其从stash列表中移除,但您可能仍然有未修剪的节点具有正确的数据。

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