Git 如何完全删除合并的拉取请求?

Git 如何完全删除合并的拉取请求?,git,github,merge,pull-request,Git,Github,Merge,Pull Request,我在GitHub上合并了一个pull请求。但是,这是一个错误,我想撤销合并、其提交,最重要的是,从历史记录中删除这几次提交引入的所有文件 我用另一个文件恢复了提交,但文件仍在提交历史记录中(它们很大),如果提交本身消失就好了 我尝试过过滤分支以删除文件,但它似乎没有缩小存储库的大小(提交仍然存在) 我该怎么办?恢复提交不会从历史记录中删除文件 如果您希望文件不仅不存在于当前磁头中,而且根本不存在,git revert不是适合您的命令。您需要运行过滤器分支,以完全删除这些文件 你说你已经做到了,但

我在GitHub上合并了一个pull请求。但是,这是一个错误,我想撤销合并、其提交,最重要的是,从历史记录中删除这几次提交引入的所有文件

我用另一个文件恢复了提交,但文件仍在提交历史记录中(它们很大),如果提交本身消失就好了

我尝试过过滤分支以删除文件,但它似乎没有缩小存储库的大小(提交仍然存在)


我该怎么办?

恢复提交不会从历史记录中删除文件

如果您希望文件不仅不存在于当前磁头中,而且根本不存在,
git revert
不是适合您的命令。您需要运行
过滤器分支
,以完全删除这些文件

你说你已经做到了,但你没有告诉我们怎么做;如果正确执行以下操作:

  • git filter branch——树过滤器
    删除文件
  • git reflog expire--expire={1秒}
  • rm-rf.git/refs/original
  • git gc
然后存储库应该收缩。您需要最后三个步骤,因为(按顺序):

  • 可以通过reflog访问原始提交
  • 对原始提交的引用由
    过滤器分支存储在
    refs/original
  • 在运行垃圾收集之前,“松散”对象不会被删除

如果您只想删除合并及其关联的提交,请使用
git reset--hard

git reset --hard <commit before merge>
git重置——硬
请注意,这将破坏您当前头部中任何未提交的更改。它还将删除合并后发生的所有提交(因此您最好使用git rebase)

重置分支后,强制推送它以使新历史保持不变


免责声明:重写已经出版的历史是一种不好的做法。如果不必这样做,请不要这样做。

使用删除合并和提交

git reset --hard <sha1>

使用树筛选器或索引筛选器无效。硬重置和重新打包也没有成功

以下是有效的方法:

git签出

git-push——强制原点磁头:master


现在我很好奇为什么这些解决方案不起作用。我正在使用
git count objects-v
中的大小包进行检查。这是正确的吗?我应该立即看到缩小还是仅在推到原点后看到缩小?

我想删除文件夹。我尝试过:git过滤器分支--树过滤器'git rm-r--cached--ignore unmatch badFolder';git reflog expire--expire=now;rm-rf.吉特/参考文献/原件;git gc;//然后:git count objects-v;但是大小没有下降。@Allan如果您使用的是
git rm
命令,您可能希望
git filter branch--index filter
而不是
git filter branch--tree filter
@Borealid您的解决方案仍然有几个漏洞-使用
git reflog expire--expire=now--all
来清除所有的reflogs(每个分支都有一个reflog,在不同的分支中可能仍然有指针),而不是运行
git-gc
,而是运行
git-repack-Ad;git-prune--expire=now
git-gc
不会从现有包文件中删除悬空对象,
repack
是必需的)。不幸的是,我不得不:(
git reflog expire --expire-unreachable=now --all
git prune
git repack -a -d