我在GitHub上合并了一个pull请求。但是,这是一个错误,我想撤消合并,它的提交,最重要的是,从历史中删除这几个提交引入的所有文件。
我用另一个恢复提交并且它可以工作,但是文件仍然在提交历史中(它们很大)如果提交本身消失将会很好。
我尝试过滤分支删除文件,但它似乎没有缩小存储库大小(并且提交仍然存在)。
我该怎么办?
答案 0 :(得分:5)
使用
删除合并和提交git reset --hard <sha1>
如@knittl所述。但是,在删除关联的悬空对象之前,您不会看到存储库大小发生任何变化。您还需要使reflog过期,以保持对这些对象的引用,例如
git reflog expire --expire-unreachable=now --all
git prune
git repack -a -d
答案 1 :(得分:1)
还原提交不会从历史记录中删除文件。
如果您希望文件不仅不存在于当前HEAD中,而且永远不存在,git revert
对您来说不是正确的命令。您需要运行filter-branch
才能完全删除这些文件。
你说你已经这样做了,但你没有告诉我们如何;如果您正确执行以下操作:
git filter-branch --tree-filter
删除文件git reflog expire --expire={1 second}
rm -rf .git/refs/original
git gc
... 然后存储库应该缩小。您需要最后三个步骤,因为(按顺序):
filter-branch
存储在refs/original
答案 2 :(得分:1)
如果您只想删除合并及其关联的提交,请使用git reset --hard
:
git reset --hard <commit before merge>
请注意,这会破坏当前HEAD中任何未提交的更改。它还将删除合并后发生的所有提交(所以你最好使用git rebase)。
重置分支后,强制推送它以使新历史记录持久。
免责声明:重写已发布的历史记录是不好的做法。如果你不需要,不要这样做。
答案 3 :(得分:1)
使用树过滤器或索引过滤器不起作用。硬重置和重新包装也没有。
这是有效的:
git checkout <commit>
git push --force origin HEAD:master
现在我很好奇为什么这些解决方案不起作用。我正在使用git count-objects -v
中的尺寸包进行检查。它是否正确?我应该立即看到尺寸减小还是仅在推到原点之后?