题 如何删除GitHub上的提交?


我“意外地”向GitHub推送了一个提交。

是否可以删除此提交?

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


1410
2018-01-15 23:20


起源


谨慎:当你有很多人关注你的存储库时,不要这样做,如果他们已经引入最新的更改,你将使他们的本地存储库不同步。如果这涉及到一个错误,你可以做另一个提交来撤消错误。如果这涉及密码,您可能需要更改密码,不要急于删除它。 强迫事情 没有缺点。 - Tom Wijsman
谨慎2: 仍然可以通过SHA1直接访问提交。强制推送不会删除提交,它会创建一个新的并将文件指针移动到它。要真正删除提交,您必须删除整个仓库。 - Gustav
谢谢,WOC2帮助我从错误删除中恢复了我的宝贵代码!谢谢! - kR105
@Gustav “......你必须删除整个回购。”  - 或者只是强行进行垃圾收集。 - IQAndreas
这个问题的Bitbucket版本。 - naught101


答案:


注意: 请看替代 git rebase -i 在下面的评论中 -

git reset --soft HEAD^

首先,删除本地存储库上的提交。你可以这样做 git rebase -i。例如,如果它是您的最后一次提交,您可以这样做 git rebase -i HEAD~2 并删除弹出的编辑器窗口中的第二行。

然后,使用强制推送到GitHub git push origin +branchName

看到 Git Magic第5章:历史教训 - 然后是一些 有关更多信息(即,如果要删除旧提交)。

哦,如果你的工作树很脏,你必须做一个 git stash 首先,然后一个 git stash apply 后。


1019
2018-01-15 23:24



更确切地说,你/有/ stash是因为git rebase -i如果你有一棵脏树就不会让你。 - Otto
请注意,这仍然会在reflog中保留提交。如果您有敏感数据,则可能必须完全删除存储库。 - troelskn
我很困惑。为什么不可能不承认 git reset --soft HEAD^ 然后呢 git push origin +master?我们为什么要使用 git rebase -i HEAD^^ 在这种情况下? - Dennis
@Dennis因为我不熟悉 reset --soft 3。5年前=) - Can Berk Güder
每个人都要小心。请参阅下面的subutux评论。即使在强行推送到GitHub之后,GH仍会缓存您的提交。从 help.github.com/articles/remove-sensitive-data :“危险:一旦推送提交,您应该考虑数据被泄露。如果您提交了密码,请更改它!如果您提交了密钥,请生成一个新密码。” - Patrick


git push -f origin HEAD^:master

这应该“撤消”推动。


854
2018-01-16 00:11



这也很好!它从github中删除了推送,但保留了我的本地存储库。谢谢! - hectorsq
嗯,是。它只做你要求的。 :)您的存储库和远程存储库不必具有匹配的引用。 - Dustin
但请注意,这只会移动分支指针。意外推送的提交仍然存在于远程仓库中。在GitHub的情况下,这意味着如果您知道SHA-1哈希(例如,来自用户活动历史记录),仍然可以看到它。 - Thiago Arrais
执行:git push -f origin HEAD ^^:master反转最后2次更改,工作n次 - ianj
@ianj注意,带有n ^的HEAD可以用HEAD~n代替,例如HEAD~3而不是HEAD ^^^。 - Mark Reed


如果它只是一个错误(也许你分叉一个回购,然后最终推到原来而不是一个新的),一个简单的还原,这是另一种可能性:

git reset --hard 71c27777543ccfcb0376dcdd8f6777df055ef479

显然,将该数字换成您想要返回的提交数。

再次按下后,一切都会被删除。为此,下一步将是:

git push --force

293
2018-04-21 20:26



警告:这将重写您的历史记录,您将失去提交,并且在协作环境中通常不是一件好事。 - Oliver
是的,这对我来说是最简单和最好的。在我发送PR之前我需要恢复我的开发分叉。我应该把我的变化放在一个分支中开始。 - Web and Flow
这适用于不受保护的分支。如果Github分支受到保护,强制推送将失败。 - Adarsha
或者:|| git reset --hard HEAD ^ 1 || (1是最后一次提交) - Marian07
很好的工作对我来说很棒 - raftaar1191


  1. git log 找出你想要恢复的提交

  2. git push origin +7f6d03:master 而7f6d03是错误推送提交之前的提交。 + 是为了 force push

就是这样。

这里 是一个非常好的指南,解决您的问题,简单易行!


71
2018-02-09 11:58



我推荐指南,超级有帮助。 - tfantina
最佳答案!发生的事情是如此清晰 - Naramsim


您需要清除缓存以完全擦除它。 这个来自git的帮助页面可以帮到你。 (它对我有帮助) http://help.github.com/remove-sensitive-data/


34
2017-07-27 22:38



+1:在从分支中删除提交时,如果您知道URL / SHA-1,它仍可在GitHub上使用。从缓存中删除提交的唯一方法是联系GH支持(请参阅该链接中的“Github上的缓存数据”部分) - Patrick
我想要注意的是,实际解释页面上的内容并引用相关部分可能是一个更好的主意。来自 帮助指南,它说:“鼓励链接到外部资源,但请在链接周围添加上下文,以便您的同事会知道它是什么以及它为什么存在。总是引用一个重要链接的最相关部分,以防目标网站无法访问或永久脱机。“经验法则:假装链接不在那里,或者他们无法点击它。 - Jeremy Rodi
还有另一种清除缓存的方法:删除存储库,然后重新创建并推送。虽然对于每个人来说这可能是不可能的,但对于许多人来说,这比联系Github支持更简单快捷(也许你不想指向第三方[Github]推送敏感数据)。 - Juliane Holzt


如果您想在删除后保留提交更改:

请注意,如果要删除的提交是最后提交的提交,则此解决方案有效。


1 - 复制您喜欢的提交引用从日志中返回:

git log

2 - 将git重置为提交引用:

 git reset <commit_ref>

3 - 存储/存储来自错误提交的本地更改,以便在推送到远程后使用:

 git stash

4 - 将更改推送到远程存储库(-f或--force):

git push -f

5 - 将存储的更改恢复到本地存储库:

git stash apply

7 - 如果您在更改中有未跟踪/新文件,则需要在提交之前将它们添加到git:

git add .

6 - 添加您需要的任何额外更改,然后提交所需的文件,(或使用点'。'而不是声明每个文件名,以提交本地存储库中的所有文件:

git commit -m "<new_commit_message>" <file1> <file2> ...

要么

git commit -m "<new_commit_message>" .

31
2018-06-07 14:44



请避免对您的答案进行微小编辑,以使其弹出到首页 - Thomas Ayoub
好的,注意到了!将停止这样做。 - Loukan ElKadi
真棒@LoukanElKadi - rustyMagnet


使用 git revert 为了恢复你的推动。

git-revert - 恢复一些现有的提交

git revert [--edit | --no-edit] [-n] [-m parent-number] [-s] <commit>...
git revert --continue
git revert --quit
git revert --abort

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


25
2017-07-17 08:21



这是避免破坏其他人克隆的推荐方法。它创建一个撤消早期提交的新提交。但它没有回答这个问题,即从“历史”中删除提交。 - joeytwiddle
许多其他答案都很好,但如果你不能强迫推动掌握,这是唯一可行的方法。 - Christopher Hunter