我“无意中”将一个提交推送到了GitHub上。
有没有可能删除这个提交?
我想要将我的GitHub仓库还原为在这个提交之前的状态。
我“无意中”将一个提交推送到了GitHub上。
有没有可能删除这个提交?
我想要将我的GitHub仓库还原为在这个提交之前的状态。
你需要知道要还原到哪个提交版本的哈希值。可以从GitHub URL中获取,例如:https://github.com/your-organization/your-project/commits/master
我们假设要还原的提交版本哈希值是“99fb454”(完整版本是“99fb45413eb9ca4b3063e07b40402b136a8cf264”),那么你需要执行以下操作:
git reset --hard 99fb45413eb9ca4b3063e07b40402b136a8cf264
git push --force
在Github上找到您希望作为分支head的提交ref规范,并使用以下命令:
git push origin +[ref]:[branchName]
如果您只想回退一次提交,例如找到该提交的ref开头(如7f6d03),以及要更改的分支名称(如master),请执行以下操作:
git push origin +7f6d03:master
加号字符被解释为--force
,这是必要的,因为您正在重写历史记录。
请注意,每当您--force
提交时,您可能会重写其他人合并您的分支的历史记录。但是,如果您快速解决问题(在任何其他人合并您的分支之前),则不会有任何问题。
如果您因为提交中包含敏感数据而这样做,使用此处提供的其他答案是不安全的(除了subutux的答案,我将对其进行扩展)。
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 reset HEAD~n
git push -f origin <branch>
--preserve-merges
选项非常重要:git rebase --preserve-merges -i HEAD^^
对于GitHub
先将本地更改保存在备份中
您可以浏览最近提交的内容,然后通过单击“复制完整SHA”按钮选择提交哈希并将其发送到剪贴板。
如果您最后的提交哈希是,假设是g0834hg304gh3084gh(例如)
您需要运行:
git push origin +g0834hg304gh3084gh:master
使用之前复制的哈希将其作为“HEAD”修订版本。
添加所需的本地更改。完成;)
git rebase -i HEAD~4
。其中的“4”代表要显示的提交总数,请根据您的提交进行相应更改,并从列表中删除您想要移除的提交。保存更改请使用Ctrl+X(ubuntu)或:wq(centos)。git revert 29f4a2 #your commit ID
这将撤销特定的提交
重写历史并不是一个好习惯。如果我们使用git revert <commit_id>
,它会创建一个干净的反向提交,用于撤销指定的提交ID。
这样,历史记录就不会被重写,而是每个人都知道已经进行了还原操作。