首页 > 解决方案 > 运行 git filter-branch 后是否可以检索存储?

问题描述

在我重新设置基准后,我跑去git filter-branch --env-filter 'GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE'修复提交日期。但是,我不知道我的藏匿处会丢失。

我尝试了以下方法:

有没有办法找回那个藏匿处?

标签: gitgit-stashgit-filter-branch

解决方案


您现有的存储并没有完全丢失。嗯,很难找到,所以从这个意义上说,它是“丢失”的。所发生的事情git filter-branch已经损坏了它。所做的是进行两次,有时甚至是git stash三次提交,其中关键的一次看起来像合并提交。大多数 Git 命令将其视为合并。这包括git filter-branch. 这可能会损坏 stash-group,因为git stash它本身需要这些奇怪的提交块——它们看起来像合并,但不能被视为合并。

但是,由于 Git 中的任何内容实际上都无法更改任何现有提交,因此 filter-branch 所做的是将存储复制到新的和“改进的”(但实际上是损坏的)提交。这个名字stash现在指的是这些新的和未改进的(deproved?depraved?)提交。

如果您没有破坏所有refs/original空间:

git update-ref refs/stash refs/original/refs/stash

将恢复refs/stash到过滤器分支操作之前的方式。(这假设单次传递filter-branch;每一次额外传递都需要-f或删除先前的refs/original/空间,其中任何一个都会破坏您想要返回此处的值。)

如果您使用的是存储“堆栈”,那么它本身就在 reflog 中refs/stash。它应该没有损坏,除了最后一个条目应该在 filter-branch 操作之前stash@{1}保留 from 的旧值。如果您破坏了名称refs/stash这提供了另一种恢复方式。如果您多次运行,您可能需要比这里更高的数字。refs/originalgit filter-branch1

如果所有其他方法都失败了,文档git fsck中描述的方法,在git stashRecovering stash entries that were clear/dropped erroneously的末尾附近,是可用的,但很痛苦。

(顺便说一句——这在一点上没有帮助——这是我建议大部分时间避免 git stash的众多原因之一。因为它所做的只是进行提交,所以只需进行正常提交。Git 的其余部分将很好地处理这些正常提交。 )


推荐阅读