Git过滤器树有助于将备份存储在.git/refs/original/refs/heads/tmp
中。但我找不到任何关于如何从中恢复的说明。从那以后,我再也没有接触过存储库——我只是改变了对这种特定操作的智慧的看法。
我猜答案要么是文件副本,要么是git update-ref
,但这些都是极具破坏性的操作,我不想出错。
以下是要知道的事情,所有其他事情都是从中产生的:除了在执行git gc
时(好吧,git gc
也会执行),git从不删除任何东西,它只会添加新东西。
假设你有一个分支,看起来像这样:
* 9d2e82c handle another temporary failure mode
| * 2afb8a0 (resubmit) checkpoint: resubmit
| * 90dcfbb move definitinon of GRONK to sysdefs
|/
* 1ba7847 treat XML login errors as temporary failures
(这是从git lola
截取并略微修改的输出:http://blog.kfish.org/2010/04/git-lola.html)。现在假设我对"重新提交"分支做了一些操作,比如一个不正确的filter-branch
,这样我在该分支上有两个新的提交(1234567和7654321,或者其他什么)。我意识到,哦,不,我做了一件完全失败的事情,我想"重新提交"回到指向提交2afb8a0,这是该分支的原始提示。
该提交仍在git中,并且将至少持续几个月(因为您有用户可见的分支名称original/refs/heads/tmp
,所以提交时间更长——例如,尝试在它上执行git log
,您会看到它在那里)。找到提交ID——在您的情况下很容易,它被命名为original/refs/heads/tmp
——并使您的分支指向那里。如果你没有名字,你可以做git branch -d resubmit
,然后做git branch resubmit 2afb8a0
(对于我上面的例子),但你有,所以:
git branch -D tmp
git branch -m original/refs/heads/tmp tmp
将删除您当前的tmp
,并将重命名后的tmp
重新命名。
(最近添加的新提交filter-branch
,你认为你不喜欢它,它仍然会在你的存储库中。一旦你删除了用户可见的名称,它们将在大约3个月后过期,之后git gc
将删除它们。)