1859

我“不小心”向 GitHub 推送了一个提交。

是否可以删除此提交?

我想恢复我的 GitHub 存储库,就像这次提交之前一样。

4

21 回答 21

1350

注意:请在下面的评论中查看替代方案git rebase -i——</p>

git reset --soft HEAD^

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

然后,通过使用强制推送到 GitHubgit push origin +branchName --force

参见Git Magic Chapter 5: Lessons of History - And Then Some了解更多信息(即如果你想删除旧的提交)。

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

于 2009-01-15T23:24:03.400 回答
1049
git push -f origin HEAD^:master

那应该“撤消”推动。

于 2009-01-16T00:11:01.683 回答
437

如果只是一个错误(也许你分叉了一个 repo,然后最终推送到原来的而不是新的),那么为了一个简单的恢复,这里有另一种可能性:

git reset --hard 71c27777543ccfcb0376dcdd8f6777df055ef479

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

一旦您再次推送,此后的所有内容都将被删除。为此,下一步将是:

git push --force
于 2014-04-21T20:26:33.600 回答
136
  1. git log 找出你想要恢复的提交

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

就是这样。

是一个很好的指南,可以解决您的问题,简单易行!

于 2016-02-09T11:58:15.887 回答
89

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

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


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>" .
于 2017-06-07T14:44:44.030 回答
41

您需要清除缓存才能将其完全清除。这个来自 git 的帮助页面会帮助你。(它帮助了我) http://help.github.com/remove-sensitive-data/

于 2011-07-27T22:38:42.777 回答
36

删除最近的提交,保留你所做的工作:

git reset --soft HEAD~1

删除最近的提交,破坏你所做的工作:

git reset --hard HEAD~1
于 2017-11-15T12:39:15.747 回答
30
1. git reset HEAD^ --hard
2. git push origin -f

这对我有用。

于 2016-08-10T08:41:55.523 回答
28

用于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 提交)。

注意git revert用于记录一些新的提交,以扭转一些早期提交的效果(通常只是一个错误的提交)。如果您想丢弃工作目录中所有未提交的更改,您应该看到git-reset,尤其是--hard选项。

于 2013-07-17T08:21:22.223 回答
22

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

 git push -f origin last_known_good_commit:branch_name

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

git reset --hard HEAD~1

关联

于 2017-03-07T01:27:45.397 回答
21

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

假设来自提交的哈希(您想要返回的地方)是“99fb454”(长版本“99fb45413eb9ca4b3063e07b40402b136a8cf264”),那么您所要做的就是:

git reset --hard 99fb45413eb9ca4b3063e07b40402b136a8cf264
git push --force
于 2016-12-20T14:21:29.907 回答
11

在 Github 上找到您希望成为分支负责人的提交的 ref 规范,然后使用以下命令:

git push origin +[ref]:[branchName]

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

git push origin +7f6d03:master

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

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

于 2015-06-22T10:36:58.730 回答
8

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

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

于 2017-01-02T14:01:18.187 回答
5

在您的终端上运行此命令。

git reset HEAD~n

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

git push -f origin <branch>

希望这可以帮助!

于 2017-01-18T02:23:40.810 回答
4

为了保留分支和合并结构,--preserve-merges在执行 rebase 时使用该选项很重要:

git rebase --preserve-merges -i HEAD^^
于 2014-05-21T00:09:09.943 回答
4

对于 GitHub

  • 在本地存储库中重置您的提交 (HARD)
  • 创建一个新分支
  • 推送新分支
  • 删除旧分支(如果要删除主分支,则将新分支作为默认分支)
于 2017-09-20T02:32:40.003 回答
2

首先将本地更改保存在旁边的某个地方(备份)

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

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

你必须运行:

git push origin +g0834hg304gh3084gh:master

使用您之前复制的哈希使其成为“HEAD”修订版。

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

于 2016-02-08T13:37:00.830 回答
1

如果你想删除做交互式变基,

git rebase -i HEAD~4

4 represents total number of commits to display count your commit and相应地改变它

并从列表中删除您想要的提交...

通过Ctrl+X(ubuntu):wq(centos)保存更改

第二种方法,做还原,

git revert 29f4a2 #your commit ID

这将恢复特定的提交

于 2017-11-15T09:56:10.563 回答
1

GitHub Desktop中,您只需右键单击提交并还原它,这将创建一个撤消更改的新提交。

意外提交仍将保留在您的历史记录中(例如,如果您不小心提交了 API 密钥或密码,这可能是一个问题),但代码将被还原。

这是最简单和最容易的选择,接受的答案更全面。

于 2018-07-19T11:05:32.917 回答
0

重写历史不是很好。如果我们使用git revert <commit_id>,它会创建所述提交 ID 的干净反向提交。

如此一来,历史就没有被改写,而是大家都知道,已经有回溯了。

于 2014-07-17T12:44:24.550 回答
-1

添加/删除文件以按照您想要的方式获取内容:

git rm classdir
git add sourcedir

然后修改提交:

git commit --amend

先前的错误提交将被编辑以反映新的索引状态 - 换句话说,就像您从一开始就没有犯过错误一样

请注意,只有在尚未推送时才应该这样做。如果您已推送,那么您只需正常提交修复即可。

于 2016-01-07T06:20:12.997 回答