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

是否可以删除此提交?

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


当前回答

你需要从你想要还原的提交中知道你的提交哈希。你可以从GitHub URL获取它,比如:https://github.com/your-organization/your-project/commits/master

假设提交的哈希(您要返回的位置)为“99fb454”(长版本“99fb 45413eb9ca4b3063e07b40402b136a8cf264”),那么您需要做的就是:

git reset --hard 99fb45413eb9ca4b3063e07b40402b136a8cf264
git push --force

其他回答

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

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

如果你这样做是因为你在提交中有敏感数据,那么使用这里的其他答案是不安全的(除了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

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

要保留分支和合并结构,在执行重基时使用--preserve merges选项非常重要:

git rebase --preserve-merges -i HEAD^^
git reset HEAD^ --hard
git push origin -f

这对我有用。

添加/删除文件以获得所需的内容:

git rm classdir
git add sourcedir

然后修改承诺:

git commit --amend

之前的错误提交将被编辑以反映新的索引状态-换句话说,这就像您一开始就没有犯过错误一样

请注意,只有当您还没有按下时,才应该执行此操作。如果您已经推送,那么您只需正常提交修复。