2

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

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

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

我该怎么办?

4

4 回答 4

5

删除合并和提交

git reset --hard <sha1>

正如@knittl 所述。但是,在删除关联的悬空对象之前,您不会看到存储库大小的任何变化。您还需要使 reflog 过期以保留对这些对象的引用,例如

git reflog expire --expire-unreachable=now --all
git prune
git repack -a -d
于 2013-01-10T20:06:08.590 回答
2

使用树过滤器或索引过滤器不起作用。硬重置和重新包装也没有。

这是有效的:

git checkout <commit>

git push --force origin HEAD:master

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

于 2013-01-11T02:46:59.813 回答
1

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

如果您希望文件不仅不存在于当前 HEAD 中,而且根本不存在git revert那么这对您来说不是正确的命令。您需要运行 afilter-branch以完全删除这些文件。

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

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

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

  • 可以通过您的 reflog 访问原始提交
  • 对原始提交的引用存储filter-branchrefs/original
  • 在您运行垃圾回收之前,不会删除“松散”的对象
于 2013-01-10T18:34:10.267 回答
1

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

git reset --hard <commit before merge>

请注意,这将破坏您当前 HEAD 中任何未提交的更改。它还将删除合并后发生的所有提交(所以也许你最好使用 git rebase)。

重置分支后,强制推送它以使新的历史持久化。

免责声明:重写已发布的历史记录是不好的做法。不要这样做,如果你没有必要。

于 2013-01-10T19:57:27.600 回答