我“不小心”向GitHub推送了一个提交。
是否可以删除此提交?
我想恢复提交之前的GitHub存储库。
我“不小心”向GitHub推送了一个提交。
是否可以删除此提交?
我想恢复提交之前的GitHub存储库。
当前回答
首先将本地更改保存在一旁的某个位置(备份)
您可以浏览最近的提交,然后单击“复制完整SHA”按钮将其发送到剪贴板。
如果您的最后一个提交哈希是,那么让我们说g0834hg304gh3084gh(例如)
您必须运行:
git推送原点+g0834hg304gh3084gh:主
使用您先前复制的哈希,使其成为“HEAD”版本。
添加所需的本地更改。完成;)
其他回答
如果你这样做是因为你在提交中有敏感数据,那么使用这里的其他答案是不安全的(除了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
您可能需要保留本地备份一段时间,以防万一。
注意:请在下面的评论中看到gitrebase-i的替代方案-git reset—软头^
首先,删除本地存储库中的提交。您可以使用gitrebase-i来执行此操作。例如,如果是最后一次提交,可以执行gitrebase-i HEAD~2并在弹出的编辑器窗口中删除第二行。
然后,使用gitpushorigin+branchName--force强制推送到GitHub
有关更多信息,请参见Git Magic第5章:历史教训-然后是一些(例如,如果您想删除旧的提交)。
哦,如果你的工作树很脏,你必须先做一个git存储,然后再应用git存储。
你需要从你想要还原的提交中知道你的提交哈希。你可以从GitHub URL获取它,比如:https://github.com/your-organization/your-project/commits/master
假设提交的哈希(您要返回的位置)为“99fb454”(长版本“99fb 45413eb9ca4b3063e07b40402b136a8cf264”),那么您需要做的就是:
git reset --hard 99fb45413eb9ca4b3063e07b40402b136a8cf264
git push --force
在Github上找到你想成为分支负责人的提交的参考规范,并使用以下命令:
git推送原点+[ref]:[branchName]
在您的情况下,如果您只想返回一次提交,请查找该提交的ref的开头,例如它是7f6d03,以及要更改的分支的名称,例如它为master,然后执行以下操作:
git推送原点+7f6d03:主
加号被解释为--force,这是必要的,因为您正在改写历史。
请注意,任何时候你强制提交,都可能会改写合并你分支的其他人的历史。然而,如果你很快发现了问题(在其他人合并你的分支之前),你就不会有任何问题。
在终端上运行此命令。
git reset HEAD~n
您可以从本地repo中删除最后n个提交,例如HEAD~2。继续在存储库上强制git推送。
git push -f origin <branch>
希望这有帮助!