我“不小心”将提交推送到GitHub。
是否可以删除此提交?
我想恢复我的GitHub存储库,因为它是在此提交之前。
备注:请在下面的评论中查看git rebase -i的替代方案-git reset --soft HEAD^
备注:请在下面的评论中查看git rebase -i的替代方案-
git rebase -i
git reset --soft HEAD^
首先,删除本地存储库上的提交。您可以使用git rebase -i执行此操作。例如,如果这是您的最后一次提交,您可以执行git rebase -i HEAD~2并删除弹出的编辑器窗口中的第二行。
git rebase -i HEAD~2
然后,使用git push origin +branchName --force强制推送到GitHub
git push origin +branchName --force
有关更多信息,请参阅Git Magic第5章:历史的教训-然后一些(即,如果您想删除旧的提交)。
哦,如果你的工作树很脏,你必须先做git stash,然后再做git stash apply。
git stash
git stash apply
git push -f origin HEAD^:master
这应该“取消”推动。
您需要清除缓存才能将其完全擦除。这个来自git的帮助页面将帮助你。(它帮助了我)http://help.github.com/remove-sensitive-data/
使用git revert恢复推送。
git revert
git-恢复-恢复一些现有的提交git revert [--edit | --no-edit] [-n] [-m parent-number] [-s] <commit>...git revert --continuegit revert --quitgit revert --abort
git-恢复-恢复一些现有的提交
git revert [--edit | --no-edit] [-n] [-m parent-number] [-s] <commit>...git revert --continuegit revert --quitgit revert --abort
恢复相关补丁引入的更改,并记录一些记录它们的新提交。这需要您的工作树是干净的(没有来自HEAD提交的修改)。
说明:git恢复用于记录一些新的提交,以扭转一些早期提交的效果(通常只是一个错误的提交)。如果你想丢弃工作目录中所有未提交的更改,你应该看到git重置,特别是--硬选项。
如果只是一个错误(也许你分叉了一个存储库,然后最终推到原来的而不是一个新的),这是另一种可能性:
git reset --hard 71c27777543ccfcb0376dcdd8f6777df055ef479
显然,将该数字交换为您要返回的提交数。
再次推送后,此后的所有内容都将被删除。为此,下一步是:
git push --force
要保留分支和合并结构,在执行rebase时使用--preserve-merges选项很重要:
--preserve-merges
git rebase --preserve-merges -i HEAD^^
重写历史不是很好。如果我们使用git revert <commit_id>,它会为所述提交ID创建一个干净的反向提交。
git revert <commit_id>
这样,历史就不会重写,相反,每个人都知道已经有了回归。
在Github上找到您想成为分支负责人的提交的ref规范,并使用以下命令:
git push origin +[ref]:[branchName]
在您的情况下,如果您只想返回一个提交,请找到该提交的ref的开头,例如它是7f6d03,以及您要更改的分支的名称,例如它是master,并执行以下操作:
git push origin +7f6d03:master
加号被解释为--force,这将是必要的,因为您正在重写历史。
--force
请注意,每当您--force提交时,您都可能重写合并您的分支的其他人的历史记录。但是,如果您快速发现问题(在其他人合并您的分支之前),您将不会有任何问题。
添加/删除文件以获得您想要的方式:
git rm classdirgit add sourcedir
然后修改提交:
git commit --amend
之前的错误提交将被编辑以反映新的索引状态-换句话说,就像你一开始就没有犯过错误一样
请注意,只有当您还没有推送时,您才应该这样做。如果您已经推送,那么您只需正常提交修复程序即可。
首先保存本地更改(备份)
您可以浏览最近的提交,然后通过单击选择提交哈希“复制完整的SHA”按钮将其发送到剪贴板。
如果你的最后一个提交哈希是,让我们说g0834hg304gh3084gh(例如)
你必须运行:
git push origin +g0834hg304gh3084gh:master
使用您之前复制的哈希使其成为“HEAD”修订版。
添加您想要的本地更改。完成;)
git log查找要恢复的提交
git log
git push origin +7f6d03:master而7f6d03是错误推送的提交之前的提交。+代表force push
+
force push
就这样了。
这里是一个很好的指南,可以解决您的问题,简单易行!
git reset HEAD^ --hardgit push origin -f
这个工作对我来说。
您需要从要恢复到的提交中知道您的提交哈希。您可以从GitHub URL获取它,例如:https://github.com/your-organization/your-project/commits/master
假设提交的哈希值(你想回到的地方)是“99fb454”(长版本“99fb45413eb9ca4b3063e07b40402b136a8cf264”),那么你所要做的就是:
git reset --hard 99fb45413eb9ca4b3063e07b40402b136a8cf264git push --force
如果您这样做是因为您在提交中有敏感数据,则使用此处的其他答案是不安全的(除了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=nowgit push origin --force --all
您可能希望将本地备份保留一段时间,以防万一。
在您的终端上运行此命令。
git reset HEAD~n
您可以从本地存储库中删除最后n次提交,例如HEAD~2。继续在您的存储库上强制git推送。
git push -f origin <branch>
希望这有帮助!
要从远程存储库中删除提交:
git push -f origin last_known_good_commit:branch_name
为了从本地存储库中删除提交:
git reset --hard HEAD~1
链接
请注意,如果要删除的提交是最后一个提交的,则此解决方案有效。
1-从日志中复制您想要返回的提交引用:
2-将git重置为提交引用:
git reset <commit_ref>
3-隐藏/存储错误提交的本地更改,以便在推送到远程后稍后使用:
4-将更改推送到远程存储库(-f或--force):
git push -f
5-将存储的更改返回到本地存储库:
7-如果您在更改中有未跟踪/新文件,您需要在提交之前将它们添加到git:
git add .
6-添加您需要的任何额外更改,然后提交所需的文件,(或使用点'.'而不是声明每个文件名,以提交本地存储库中的所有文件:
git commit -m "<new_commit_message>" <file1> <file2> ...
或
git commit -m "<new_commit_message>" .
对于github
如果您想删除do交互式rebase,
git rebase -i HEAD~4
4 represents total number of commits to display count your commit and相应地改变它
4 represents total number of commits to display count your commit and
并从列表中删除您想要的提交…
保存更改Ctrl+X(ubuntu)或: wq(centos)
第二种方法,做还原,
git revert 29f4a2 #your commit ID
这将恢复特定的提交
删除最近的提交,保留你所做的工作:
git reset --soft HEAD~1
删除最近的提交,破坏你所做的工作:
在github桌面版中,您可以右键单击提交并恢复它,这将创建一个撤消更改的新提交。
意外提交仍将在您的历史记录中(例如,如果您意外提交了API密钥或密码,这可能是一个问题),但代码将被恢复。
这是最简单易行的选择,公认的答案更全面。