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

g2ieeal7  于 2023-06-04  发布在  Git
关注(0)|答案(5)|浏览(309)

我在GitHub上合并了一个pull request。然而,这是一个错误,我想撤销合并,它的提交,最重要的是,从历史记录中删除这几个提交引入的所有文件。
我用另一个提交恢复了这个提交,它工作了,但是文件仍然在提交历史中(它们很大),如果提交本身消失就好了。
我试过使用filter-branch来删除文件,但似乎并没有缩小存储库的大小(提交仍然存在)。
我该怎么办?

jjjwad0x

jjjwad0x1#

移除合并和提交

git reset --hard <sha1>

如@knittl所述。但是,在删除关联的悬挂对象之前,您不会看到存储库大小的任何更改。你还需要终止reflog对这些对象的引用,例如。

git reflog expire --expire-unreachable=now --all
git prune
git repack -a -d
gijlo24d

gijlo24d2#

使用树过滤器或索引过滤器不起作用。硬复位和重新 Package 也没有。
以下是成功的方法:
git checkout <commit>
git push --force origin HEAD:master
现在我很好奇为什么这些解决方案不起作用。我在git count-objects -v中使用大小包进行检查。是这样吗?我应该立即看到尺寸减小,还是只有在推到原点之后才能看到?

2w3kk1z5

2w3kk1z53#

恢复提交不会从历史记录中删除文件。
如果您不仅希望文件不存在于当前HEAD中,而且希望 * 根本不存在 *,git revert并不适合您。您需要运行filter-branch来完全删除这些文件。
你说你已经做过了,但你不告诉我们怎么做;如果您正确执行以下操作:

  • git filter-branch --tree-filter删除文件
  • git reflog expire --expire={1 second}
  • rm -rf .git/refs/original
  • git gc

...repository应该收缩。你需要最后三个步骤,因为(按顺序):

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

nr7wwzry4#

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

git reset --hard <commit before merge>

请注意,这将销毁当前HEAD中所有未提交的更改。它还会删除合并后发生的所有提交(所以你最好使用git rebase)。
重置分支后,强制推送它以使新的历史保持不变。

免责声明:重写已经发表的历史是不好的做法。如果没必要,就别这么做。

f5emj3cl

f5emj3cl5#

在我看来,最好的方法是使用Git Reflog:

git reflog

检查哪个点最适合你,然后移动到那里:

git reset --hard HEAD@{124}

然后,强制推送🦖

相关问题