我跟着GitHub's instructions for removing sensitive files from a git repository,因为我想删除一些本不应该签入的二进制文件。
我对git filter-branch
命令的第一次调用失败了:
无法使用脏工作目录重写分支。
因为我有本地更改。所以,我用git stash
隐藏了这些更改,并重新运行了filter-branch命令。
然后我根据GitHub指令运行这些命令:
rm -rf .git/refs/original
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now
删除二进制文件似乎完美无缺。但是,当我现在键入git stash list
时,不会显示我在旧主服务器上添加的存储条目。
在我第二次执行filter-branch命令之前,我所拥有的是git stash
的输出:
Saved working directory and index state WIP on master: a19db18 LOG_MESSAGE
HEAD is now at a19db18 LOG_MESSAGE
此外,a19db18332b19ea41be888eccfc07e6680d8d6dd
是被重写的提交之一。
有没有办法检索隐藏的更改?
答案 0 :(得分:1)
除非你能记住存储提交对象的SHA1哈希值(是的,stashes create commit objects),否则存储可能会丢失。一种选择是使用git fsck --lost-found
并查找悬空提交对象。然后你必须逐个完成,直到找到你藏匿的那个。您可以使用gitk查看所有这些提交(请参阅git fsck
帮助页面以获取有关如何执行此操作的示例),并希望更轻松地找到存储提交。找到提交后,可以在每个提交上使用git cherry-pick
,清除所有冲突,然后执行git reset HEAD~2
(因为每个存储都有两次提交)。你应该好好去。
我从来没有做过藏匿,然后就像过滤器分支一样危险。将来,我建议您对正在进行的工作进行实际提交 - 也许将其放在新的分支上。然后运行危险的操作。之后,您可以使用上面的混合重置回滚提交。