如何删除GitHub上的提交?

时间:2009-01-15 23:20:54

标签: git github git-commit

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

是否可以删除此提交?

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

21 个答案:

答案 0 :(得分:1109)

  

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

     

git reset --soft HEAD^

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

然后,使用git push origin +branchName --force

强制推送到GitHub

有关详细信息,请参阅Git Magic Chapter 5: Lessons of History - And Then Some(例如,如果您要删除较旧的提交)。

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

答案 1 :(得分:902)

git push -f origin HEAD^:master

那应该“撤消”推动。

答案 2 :(得分:318)

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

git reset --hard 71c27777543ccfcb0376dcdd8f6777df055ef479

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

再次推动后,将删除此后的所有内容。为此,下一步将是:

git push --force

答案 3 :(得分:85)

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

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

  3. 就是这样。

    Here是一个非常好的指南,可以轻松简单地解决您的问题!

答案 4 :(得分:45)

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

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

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

答案 5 :(得分:35)

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

答案 6 :(得分: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提交的修改)。

答案 7 :(得分:21)

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

这项工作适合我。

答案 8 :(得分:16)

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

 git push -f origin last_known_good_commit:branch_name

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

git reset --hard HEAD~1

link

答案 9 :(得分:12)

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

git reset --soft HEAD~1

删除最近的提交,销毁您已完成的工作:

git reset --hard HEAD~1

答案 10 :(得分:9)

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

git push origin +[ref]:[branchName]

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

git push origin +7f6d03:master

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

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

答案 11 :(得分:9)

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

让我们说一下提交的哈希值(你要回去的地方)是&#34; 99fb454&#34; (长版&#34; 99fb45413eb9ca4b3063e07b40402b136a8cf264&#34;),那么你所要做的就是:

{{1}}

答案 12 :(得分:6)

如果你这样做是因为你在提交中有敏感数据,那么在这里使用其他答案是不安全的(除了subutux&#39; s,我将扩展)。

github guide on this建议使用外部工具,但我更喜欢使用内置工具。

首先,备份您的存储库。然后:

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

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

答案 13 :(得分:5)

在终端上运行此命令。

git reset HEAD~n

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

git push -f origin <branch>

希望这有帮助!

答案 14 :(得分:3)

保留分支和合并结构对于在执行rebase时使用--preserve-merges选项非常重要:

git rebase --preserve-merges -i HEAD^^

答案 15 :(得分:2)

首先将本地更改保存在侧面(备份)

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

如果你的最后一次提交哈希是,那么就说g0834hg304gh3084gh(例如)

你必须跑:

XRegExp.matchRecursive(str, '\\(', '\\)', 'g');

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

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

答案 16 :(得分:1)

对于GitHub

  • 重置您的本地存储库中的提交(HARD)
  • 创建新分支
  • 推新
  • 删除OLD分支(如果要删除主分支,则将新分支作为默认分支)

答案 17 :(得分:0)

如果你想删除do interactive rebase,

git branch -d `git branch --list '3.2.*'`

git rebase -i HEAD~4相应更改

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

Ctrl + X(ubuntu):wq(centos)

保存更改

第二种方法,做还原,

4 represents total number of commits to display count your commit and

这将还原特定的提交

答案 18 :(得分:-1)

添加/删除文件以获得您想要的内容:

git rm classdir
git add sourcedir

然后修改提交:

git commit --amend

之前的错误提交将被编辑以反映新的索引状态 - 换句话说,它就像你从来没有犯过错误

请注意,只有在尚未推送的情况下才应执行此操作。如果你已推,那么你只需要正常提交修复。

答案 19 :(得分:-1)

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

这样,历史不会被重写,相反,每个人都知道有一个恢复。

答案 20 :(得分:-1)

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

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

这是最简单,最简单的选项,被接受的答案更加全面。