有人意外地将80兆的JPG检入我们的git存储库并将其推送到github中央存储库。
此后有几个人撤了这些变化。
除了拍摄提交者之外,我还能从存储库的历史记录和github中完全删除这些图像?然后在其他提交者身上造成所有更改。
答案 0 :(得分:4)
您需要使用git reset sha_of_last_good_commit
修复更改,而不是使用git push -f
推送备份。您需要告诉每个人撤回新的更改。
如果您希望与糟糕提交混合进行更改,则需要git rebase -i
在推送修复}之前拔出您不想要的更改 repo回到github。
垃圾收集最终将删除悬空物体,或者您可以使用git gc --aggressive
答案 1 :(得分:1)
更激进的方法是使用filter-branch
。
git filter-branch --tree-filter 'rm -f *.jpg' HEAD
然而,在使用它时你应该非常小心,因为你真的可以搞砸你的回购。在执行任何操作之前,您应该检查docs。
答案 2 :(得分:0)
使用git reset将更改还原到此人提交之前。我认为不可能对已经撤消更改的人强制更新。
git reset --hard HEAD~3 ## will reset the head to three commits ago
第二个想法,文档说:
最后三次提交(HEAD,HEAD ^和HEAD~2)都很糟糕,你这样做了 不想再见到他们了。如果你已经这样做,不要这样做 鉴于这些提交给其他人。
tl; dr - 只需删除文件即可。我不知道你可以删除历史,你不能强迫在像git这样的分布式系统中更新某些东西。
答案 3 :(得分:0)
即使您git reset --hard HEAD~3
,然后git push --force
问题仍未解决。
由gpojd引用:
如果您已将这些提交给其他人
,请不要这样做
但是,你做到了。如果您将修改后的版本推送到中央仓库,并且已经从中央仓库获取了包含三次错误提交的版本的人,那么他/她的仓库中仍会存在三个错误提交。
当三个糟糕的提交存在时,所有已经从回购中撤出的人将不得不从他/她的回购中删除这些错误的提交以使它们再次清洁。
所以告诉他们启动一个控制台并使用git fetch origin
(从GitHub获取版本)git rebase -i origin/master
来修改他们强制推送的主分支并告诉他们SHA-ID提交他们将不得不删除。