删除旧提交:`git rebase`导致合并冲突
不幸的是,不久前我们意外地签入了一个大的二进制文件,直到今天还没有人注意到。现在我想放弃那个承诺,让剩下的历史保持原样。我知道改变历史的注意事项,但在这种情况下,我无法避免 我一直在努力实现这一目标约1小时,但未能实现。我找到的最好的命令是删除旧提交:`git rebase`导致合并冲突,git,git-rebase,git-merge,Git,Git Rebase,Git Merge,不幸的是,不久前我们意外地签入了一个大的二进制文件,直到今天还没有人注意到。现在我想放弃那个承诺,让剩下的历史保持原样。我知道改变历史的注意事项,但在这种情况下,我无法避免 我一直在努力实现这一目标约1小时,但未能实现。我找到的最好的命令是 git rebase --interactive --preserve-merges $(EVIL_COMMIT)^ 在编辑的评论中,第一个罪过是邪恶的 不幸的是,git-rebase在合并时停止,并提示手动解决合并冲突。邪恶犯罪只是添加了一些我们的软件为
git rebase --interactive --preserve-merges $(EVIL_COMMIT)^
在编辑的评论中,第一个罪过是邪恶的
不幸的是,git-rebase
在合并时停止,并提示手动解决合并冲突。邪恶犯罪只是添加了一些我们的软件为测试目的而计算的示例文件。因此,它们不应该与刚刚丢失的示例文件有任何冲突
我在谷歌花了很多时间,所以搜索。有些线程涉及类似的主题,但要么是在今天的Git版本中,要么对我不起作用(我只描述了上面的一种方法,因为它是最简单的方法)。我会使用
过滤器分支
:
git filter-branch --prune-empty --index-filter '
git rm --cached --ignore-unmatch path/to/file
' --all
我的朋友启动了一个方便的脚本,用于从git历史记录中清除文件,请选中这只会从所有版本中删除文件
path/to/file
,对吗?据我所知,它没有删除提交,在删除二进制文件后,提交将保留为空(实际上有4个)。我想你的意思是HEAD
,而不是$(邪恶提交)^
在这个答案中-否则它只会过滤提交到引入大文件之前的提交。git-rm
的选项是--忽略不匹配
而不使用~ed。我使用git-filter分支--索引过滤器'git-rm--cached成功地从我的repo中删除了引入二进制文件的提交--忽略不匹配--删除空文件{A、B、C、D}头
。我对所有的分支都这样做了,包括上游的分支。不幸的是,git-prune
没有删除对象,但我找不到对文件的任何引用。我尝试过,但它没有列出任何包含二进制文件的提交:-/谢谢你的评论@halo:您必须使reflogs过期,并删除refs/原始的ref名称空间(出于安全原因由git保留)的可能副本