我在GitHub上合并了一个pull request。然而,这是一个错误,我想撤销合并,它的提交,最重要的是,从历史记录中删除这几个提交引入的所有文件。我用另一个提交恢复了这个提交,它工作了,但是文件仍然在提交历史中(它们很大),如果提交本身消失就好了。我试过使用filter-branch来删除文件,但似乎并没有缩小存储库的大小(提交仍然存在)。我该怎么办?
jjjwad0x1#
移除合并和提交
git reset --hard <sha1>
如@knittl所述。但是,在删除关联的悬挂对象之前,您不会看到存储库大小的任何更改。你还需要终止reflog对这些对象的引用,例如。
git reflog expire --expire-unreachable=now --all git prune git repack -a -d
gijlo24d2#
使用树过滤器或索引过滤器不起作用。硬复位和重新 Package 也没有。以下是成功的方法:git checkout <commit>git push --force origin HEAD:master现在我很好奇为什么这些解决方案不起作用。我在git count-objects -v中使用大小包进行检查。是这样吗?我应该立即看到尺寸减小,还是只有在推到原点之后才能看到?
git checkout <commit>
git push --force origin HEAD:master
git count-objects -v
2w3kk1z53#
恢复提交不会从历史记录中删除文件。如果您不仅希望文件不存在于当前HEAD中,而且希望 * 根本不存在 *,git revert并不适合您。您需要运行filter-branch来完全删除这些文件。你说你已经做过了,但你不告诉我们怎么做;如果您正确执行以下操作:
git revert
filter-branch
git filter-branch --tree-filter
git reflog expire --expire={1 second}
rm -rf .git/refs/original
git gc
...则repository应该收缩。你需要最后三个步骤,因为(按顺序):
refs/original
nr7wwzry4#
如果你只想删除合并及其关联的提交,使用git reset --hard:
git reset --hard
git reset --hard <commit before merge>
请注意,这将销毁当前HEAD中所有未提交的更改。它还会删除合并后发生的所有提交(所以你最好使用git rebase)。重置分支后,强制推送它以使新的历史保持不变。
免责声明:重写已经发表的历史是不好的做法。如果没必要,就别这么做。
f5emj3cl5#
在我看来,最好的方法是使用Git Reflog:
git reflog
检查哪个点最适合你,然后移动到那里:
git reset --hard HEAD@{124}
然后,强制推送🦖
5条答案
按热度按时间jjjwad0x1#
移除合并和提交
如@knittl所述。但是,在删除关联的悬挂对象之前,您不会看到存储库大小的任何更改。你还需要终止reflog对这些对象的引用,例如。
gijlo24d2#
使用树过滤器或索引过滤器不起作用。硬复位和重新 Package 也没有。
以下是成功的方法:
git checkout <commit>
git push --force origin HEAD:master
现在我很好奇为什么这些解决方案不起作用。我在
git count-objects -v
中使用大小包进行检查。是这样吗?我应该立即看到尺寸减小,还是只有在推到原点之后才能看到?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应该收缩。你需要最后三个步骤,因为(按顺序):
filter-branch
存储在refs/original
中nr7wwzry4#
如果你只想删除合并及其关联的提交,使用
git reset --hard
:请注意,这将销毁当前HEAD中所有未提交的更改。它还会删除合并后发生的所有提交(所以你最好使用git rebase)。
重置分支后,强制推送它以使新的历史保持不变。
免责声明:重写已经发表的历史是不好的做法。如果没必要,就别这么做。
f5emj3cl5#
在我看来,最好的方法是使用Git Reflog:
检查哪个点最适合你,然后移动到那里:
然后,强制推送🦖