我“不小心”向GitHub推送了一个提交。

是否可以删除此提交?

我想恢复提交之前的GitHub存储库。


当前回答

为了方便还原,还有一种可能性(自提交以来的所有内容都将被删除):

git reset --hard commit_hash_you_want_to_return_to

例如,如果您想将分支重置为过去的提交,如71c27777543ccfcb0376dcdd8f6777df055ef479:

git reset --hard 71c27777543ccfcb0376dcdd8f6777df055ef479

下一步是将分支修改推送到源(远程回购):

git push --force

注意

请记住,如果其他贡献者正在与您的分支机构合作,他们可能会遇到冲突或其他问题,因为您正在更改分支机构的历史记录,但仅限于您,而不是那些已经使用您的分支的人。当心

其他回答

如果你这样做是因为你在提交中有敏感数据,那么使用这里的其他答案是不安全的(除了subtux的,我将进一步讨论)。

github指南建议使用外部工具,但我更喜欢使用内置工具。

首先,备份存储库。然后:

git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' \
--prune-empty --tag-name-filter cat -- --all

之后,确保存储库处于所需的状态。您可能需要与备份进行比较。

如果你确定这是正确的,那么:

#get rid of old unreferenced commits (including the data you want to remove)
git gc --prune=now
git push origin --force --all

您可能需要保留本地备份一段时间,以防万一。

您需要清除缓存以将其完全清除。git的这个帮助页面将帮助您。(这对我有帮助)http://help.github.com/remove-sensitive-data/

要从远程存储库中删除提交,请执行以下操作:

 git push -f origin last_known_good_commit:branch_name

要从本地存储库中删除提交,请执行以下操作:

git reset --hard HEAD~1

link

重写历史不是很好。若我们使用git-restore<commit_id>,它将创建所述提交id的干净反向提交。

这样,历史就不会被改写了,相反,每个人都知道,历史已经发生了逆转。

使用git-restore恢复推送。

git-restore-还原一些现有提交git-restore[-edit|--no edit][-n][-m父编号][-s]<commit>。。。git revert--继续git revert—退出git revert—中止

还原相关修补程序引入的更改,并记录记录这些更改的一些新提交。这需要你的工作树是干净的(没有来自HEAD提交的修改)。

注意:git-restore用于记录一些新的提交,以反转一些早期提交的效果(通常只有一个错误的提交)。如果要丢弃工作目录中所有未提交的更改,应该看到git reset,特别是--hard选项。