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

时间:2013-01-10 18:23:44

标签: git github merge pull-request

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

我用另一个恢复提交并且它可以工作,但是文件仍然在提交历史中(它们很大)如果提交本身消失将会很好。

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

我该怎么办?

4 个答案:

答案 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

... 然后存储库应该缩小。您需要最后三个步骤,因为(按顺序):

  • 原始提交可通过您的reflog
  • 访问
  • 原始提交的引用由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中的尺寸包进行检查。它是否正确?我应该立即看到尺寸减小还是仅在推到原点之后?