如何删除GitHub上的提交?

hectorsq 1619 git github git-commit

我"意外地"向GitHub推送了一个提交.

是否可以删除此提交?

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

Can Berk Güd.. 1154

注:请参阅git rebase -i以下评论中的替代方案 -

git reset --soft HEAD^

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

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

请参阅Git Magic第5章:历史课程 - 然后了解更多信息(例如,如果您要删除较旧的提交).

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

  • 我糊涂了.为什么不能用`git reset --soft HEAD ^`来解除,然后做`git push origin + master`?为什么我们在这种情况下使用`git rebase -i HEAD ^^`? (111认同)
  • @Dennis,因为我不熟悉3.5年前的`reset --soft`.=) (47认同)
  • 每个人都要小心.请参阅下面的subutux评论.即使在强行推送到GitHub之后,GH仍会缓存您的提交.来自https://help.github.com/articles/remove-sensitive-data:"危险:一旦推送提交,您应该考虑数据被泄露.如果您提交了密码,请更改它!如果您提交了关键,生成一个新的." (29认同)
  • 请注意,这仍然会在reflog中保留提交.如果您有敏感数据,则可能必须完全删除存储库. (19认同)
  • 更准确地说,你/有/ stash是因为git rebase -i如果你有一棵脏树就不会让你. (12认同)

Dustin.. 923

git push -f origin HEAD^:master

这应该"撤消"推动.

  • 执行:git push -f origin HEAD ^^:master反转最后2次更改,工作n次 (83认同)
  • 这也很好!它从github中删除了推送,但保留了我的本地存储库.谢谢! (31认同)
  • 但请注意,这只会移动分支指针.意外推送的提交仍然存在于远程仓库中.在GitHub的情况下,这意味着如果您知道SHA-1哈希(例如,来自用户活动历史记录),仍然可以看到它. (31认同)
  • @ianj注意,带有n ^的HEAD可以用HEAD~n代替,例如HEAD~3而不是HEAD ^^^. (20认同)
  • 嗯,是.它只做你要求的.:)您的存储库和远程存储库不必具有匹配的引用. (11认同)
  • 如果您正在使用github应用程序,您还可以导航到"历史记录"屏幕,打开您的提交,然后单击"还原提交",或者您可以选择以前的提交并单击"还原到此提交"."恢复此提交"将恢复该提交后发生的所有更改.我发现只要您的工作目录是干净的,该应用程序就可以正常工作.如果不是这样,应用程序可能会很快出现问题,在这种情况下,命令行将有助于保持正确. (4认同)
  • 我删除了本地提交:`git reset --hard HEAD~1`(http://stackoverflow.com/questions/1338728/how-to-delete-a-git-commit) (4认同)
  • 使用zsh使用`git push -f origin HEAD\^:master`或`git push -f origin HEAD~:master` (2认同)

CodeWalrus.. 336

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

git reset --hard 71c27777543ccfcb0376dcdd8f6777df055ef479

显然,将该数字换成要返回的提交数.

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

git push --force

  • 警告:这将重写您的历史记录,您将失去提交,并且在协作环境中通常不是一件好事. (6认同)
  • 是的,这对我来说是最简单和最好的.在我发送PR之前我需要恢复我的开发分叉.我应该把我的变化放在一个分支中开始. (6认同)

kate.. 95

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

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

就是这样.

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

  • 我推荐指南,超级有帮助. (2认同)

Loukan ElKad.. 54

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

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


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>" .


小智.. 35

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

  • +1:在从分支中删除提交时,如果您知道URL/SHA-1,它仍可在GitHub上使用.从缓存中删除提交的唯一方法是联系GH支持(请参阅该链接中的"Github上的缓存数据"部分) (9认同)
  • 我想要注意的是,实际解释页面上的内容可能是一个更好的主意,并引用相关部分.从[帮助指南](http://stackoverflow.com/help/how-to-answer),它说:"鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户有一些想法它是什么以及它为什么存在.总是引用重要链接中最相关的部分,以防目标站点无法访问或永久脱机." 经验法则:假装链接不在那里,或者他们无法点击它. (4认同)

Jyoti Prakas.. 26

使用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提交的修改).

  • 这是避免破坏其他人克隆的推荐方法.它创建一个撤消早期提交的新提交.但它没有回答这个问题,即从"历史"中删除提交. (11认同)

Hilen.. 23

1. git reset HEAD^ --hard
2. git push origin -f

这对我有用.


george mano.. 17

要从远程存储库中删除提交:

 git push -f origin last_known_good_commit:branch_name

为了从本地存储库中删除提交:

git reset --hard HEAD~1

链接


小智.. 16

删除最近的提交,保留您已完成的工作:

git reset --soft HEAD~1

删除最近的提交,破坏您已完成的工作:

git reset --hard HEAD~1

  • 那之后的推销呢? (4认同)

Benny Neugeb.. 10

您需要知道要恢复的提交中的提交哈希值.您可以从GitHub URL获取它,例如:https://github.com/your-organization/your-project/commits/master

让我们说提交中的哈希值(你要返回的地方)是"99fb454"(长版本"99fb45413eb9ca4b3063e07b40402b136a8cf264"),那么你所要做的就是:

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


orb.. 9

在Github上找到您想要成为分支头的提交的ref规范,并使用以下命令:

git push origin +[ref]:[branchName]

在您的情况下,如果您只想返回一个提交,请找到该提交的ref的开头,例如它是7f6d03,以及您想要更改的分支的名称,例如它是master,以及请执行下列操作:

git push origin +7f6d03:master

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

请注意,无论--force何时提交,您都可能会重写合并分支的其他人的历史记录.但是,如果您快速发现问题(在其他任何人合并您的分支之前),您将不会遇到任何问题.


goncalopp.. 7

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

您可能希望保留本地备份一段时间,以防万一.


小智.. 5

在终端上运行此命令.

git reset HEAD~n

您可以从本地仓库删除最后n次提交,例如HEAD~2.在您的存储库上继续强制git push.

git push -f origin <branch>

希望这可以帮助!


归档时间:

查看次数:

854271 次

最近记录:

1 年 前