如何在GitHub上删除提交?

2023

我“无意中”将一个提交推送到了GitHub上。

有没有可能删除这个提交?

我想要将我的GitHub仓库还原为在这个提交之前的状态。


224
警告:如果你有很多人关注你的代码仓库,千万不要这样做,否则会导致他们本地的代码仓库与最新版本不同步。如果这是一个错误,你可以再提交一次撤销错误。如果这涉及密码,你可能需要更改密码,而不要着急删除它。强制性操作并非没有缺点。 - Tamara Wijsman
177
注意事项2:通过SHA1,提交仍然可以直接访问。强制推送并不会删除提交,它只是创建一个新的提交并将文件指针移动到该提交。要真正删除提交,您必须删除整个存储库。 - Gustav
31
“...你必须删除整个代码库。” - 或者只需强制进行垃圾回收即可。 - IQAndreas
6
关于WOC1,下一次关注者拉取时,他们将自动获取新的历史记录并失去旧的记录,这似乎是相当可接受的行为。问题是,如果其他人在您提交之后进行了新的工作:那么您会给他们带来很大的麻烦(他们需要将更改挑选到新的历史记录上)。因此,在* 1分钟 之后进行强制推送比在 1周 之后更容易被接受(暴露给较少的关注者),对于人们仅使用而不修改*的项目也更容易被接受(他们不会注意到时间轴已更改)。 - joeytwiddle
11
这是一个关于在Bitbucket上删除最后一次提交的问题。 - naught101
显示剩余9条评论
21个回答

24

你需要知道要还原到哪个提交版本的哈希值。可以从GitHub URL中获取,例如:https://github.com/your-organization/your-project/commits/master

我们假设要还原的提交版本哈希值是“99fb454”(完整版本是“99fb45413eb9ca4b3063e07b40402b136a8cf264”),那么你需要执行以下操作:

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

11

在Github上找到您希望作为分支head的提交ref规范,并使用以下命令:

git push origin +[ref]:[branchName]

如果您只想回退一次提交,例如找到该提交的ref开头(如7f6d03),以及要更改的分支名称(如master),请执行以下操作:

git push origin +7f6d03:master

加号字符被解释为--force,这是必要的,因为您正在重写历史记录。

请注意,每当您--force提交时,您可能会重写其他人合并您的分支的历史记录。但是,如果您快速解决问题(在任何其他人合并您的分支之前),则不会有任何问题。


11

如果您因为提交中包含敏感数据而这样做,使用此处提供的其他答案是不安全的(除了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

为了以防万一,您可能希望将本地备份保留一段时间。


2
相关链接:https://dev59.com/73NA5IYBdhLWcg3wrPyq#32840254 我认为这种方法不够安全,数据仍然可以通过提交来访问。 - Ciro Santilli OurBigBook.com

7
在你的终端上运行以下命令。
git reset HEAD~n

您可以从本地仓库中删除最后的n次提交,例如 HEAD~2。 在您的存储库上强制执行 git push。
git push -f origin <branch>

希望这能帮到您!

4
为了保留分支和合并结构,重置时使用--preserve-merges选项非常重要:
git rebase --preserve-merges -i HEAD^^

注意:不建议同时使用 --preserve-merges--interactive。请参阅 rebase 的 BUGS 部分 - galath

4

对于GitHub

  • 在本地仓库中重置您的提交(HARD)
  • 创建一个新分支
  • 推送新分支
  • 删除旧分支(如果要删除主分支,请将新分支设置为默认分支)

2

先将本地更改保存在备份中

您可以浏览最近提交的内容,然后通过单击“复制完整SHA”按钮选择提交哈希并将其发送到剪贴板。

如果您最后的提交哈希是,假设是g0834hg304gh3084gh(例如)

您需要运行:

git push origin +g0834hg304gh3084gh:master

使用之前复制的哈希将其作为“HEAD”修订版本。

添加所需的本地更改。完成;)


2
GitHub Desktop中,您只需右键单击提交并撤消它,这将创建一个新的提交以撤消更改。
意外提交仍将出现在历史记录中(如果您意外提交了API密钥或密码,则可能会有问题),但代码将被还原。
这是最简单、最容易的选项,接受的答案更为全面。

我曾经看到这个问题在Git Flow中引起了麻烦。例如,你不小心将开发分支合并到主分支上,但该功能尚未发布。如果你只是撤销了那次合并,那么当你将主分支合并回开发分支时,它将从中删除该功能。 - pumpkinthehead

1
如果您想要移除交互式变基,可以使用以下命令:git rebase -i HEAD~4。其中的“4”代表要显示的提交总数,请根据您的提交进行相应更改,并从列表中删除您想要移除的提交。保存更改请使用Ctrl+X(ubuntu):wq(centos)
第二种方法是执行还原操作。
git revert 29f4a2 #your commit ID

这将撤销特定的提交


0

重写历史并不是一个好习惯。如果我们使用git revert <commit_id>,它会创建一个干净的反向提交,用于撤销指定的提交ID。

这样,历史记录就不会被重写,而是每个人都知道已经进行了还原操作。


这个较早的答案已经告诉用户使用 git revert链接 - user456814
不符合此要求:“我想将我的GitHub存储库还原为此提交之前的状态”。 - Steve Bennett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接