我“意外地”向GitHub推送了一个提交 .
是否可以删除此提交?
我想恢复我提交之前的GitHub存储库 .
要从远程存储库中删除提交:
git push -f origin last_known_good_commit:branch_name
为了从本地存储库中删除提交:
git reset --hard HEAD~1
link
对于GitHub - 重置您的本地仓库中的提交(HARD)并创建一个新分支 . 推新 . 删除OLD分支 . (如果要删除主分支,请将新分支作为默认分支)
您需要清除缓存以完全擦除它 . 这个来自git的帮助页面可以帮到你 . (它帮助了我)http://help.github.com/remove-sensitive-data/
删除最近的提交,保留您已完成的工作:
git reset --soft HEAD~1
删除最近的提交,破坏您已完成的工作:
重写历史不是很好 . 如果我们使用 git revert <commit_id> ,它会创建所述提交ID的干净反向提交 .
git revert <commit_id>
这样,历史不会被重写,相反,每个人都知道有一个恢复 .
注意:请在下面的评论中查看git rebase -i的替代方案 - git reset --soft HEAD ^
首先,删除本地存储库上的提交 . 您可以使用 git rebase -i 执行此操作 . 例如,如果它是您的上次提交,则可以执行 git rebase -i HEAD~2 并删除弹出的编辑器窗口中的第二行 .
git rebase -i
git rebase -i HEAD~2
然后,使用 git push origin +branchName --force 强制推送到GitHub
git push origin +branchName --force
有关更多信息,请参阅Git Magic Chapter 5: Lessons of History - And Then Some(即,如果要删除较旧的提交) .
哦,如果你的工作树很脏,你必须先做 git stash ,然后做 git stash apply .
git stash
git stash apply
1. git reset HEAD^ --hard 2. git push origin -f
这对我有用 .
在Github上找到您想要成为分支头的提交的ref规范,并使用以下命令:
git push origin +[ref]:[branchName]
在您的情况下,如果您只想返回一个提交,请找到该提交的ref的开头,例如它是7f6d03,以及要更改的分支的名称,例如它是master,以及请执行下列操作:
git push origin +7f6d03:master
加号字符被解释为 --force ,这是必要的,因为您正在重写历史记录 .
--force
请注意,每当您提交 --force 时,您可能会重写其他人' history who merge your branch. However, if you catch the problem quickly (before anyone else merges your branch), you won' t有任何问题 .
在终端上运行此命令 .
git reset HEAD~n
您可以从本地仓库删除最后n次提交,例如HEAD〜2 . 在您的存储库上继续强制git push .
git push -f origin <branch>
希望这可以帮助!
使用 git revert 恢复推送 .
git revert
git-revert - 恢复一些现有的提交git revert [--edit | --no-edit] [-n] [-m parent-number] [-s] <commit> ...git revert - 继续git revert --quitgit revert --abort
还原相关修补程序引入的更改,并记录一些记录它们的新提交 . 这需要您的工作树是干净的(没有HEAD提交的修改) .
在GitHub Desktop中,您可以右键单击提交并将其还原,这将创建一个撤消更改的新提交 .
意外提交仍将在您的历史记录中(例如,如果您不小心提交了API密钥或密码,则可能会出现问题)但代码将被还原 .
这是最简单和最简单的选择,接受的答案更全面 .
If you are doing this because you have sensitive data in a commit, using the other answers here is not safe (除了subutux 's, which I' ll展开) .
github guide on this建议使用外部工具,但我更喜欢使用内置工具 .
首先, make a backup of your repository . 然后:
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
在此之后, make sure the repository is in the state you want . 您可能想要对备份进行区分 .
如果您确定它是正确的,那么:
#get rid of old unreferenced commits (including the data you want to remove) git gc --prune=now git push origin --force --all
您可能希望保留本地备份一段时间,以防万一 .
您需要知道要恢复的提交中的提交哈希 . 你可以从GitHub网址获取它,如:https://github.com/your-organization/your-project/commits/master
假设提交的哈希值(你要返回的地方)是“99fb454”(长版本“99fb45413eb9ca4b3063e07b40402b136a8cf264”),那么你所要做的就是:
git reset --hard 99fb45413eb9ca4b3063e07b40402b136a8cf264 git push --force
如果你想删除做交互式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
这将恢复特定的提交
首先将本地更改保存在某处(备份)
您可以浏览最近的提交,然后通过单击“复制完整的SHA”按钮将其发送到剪贴板来选择提交哈希 .
如果您最后一次提交哈希值,那么就说g0834hg304gh3084gh(例如)
你必须运行:
git push origin +g0834hg304gh3084gh:master
使用您之前复制的哈希使其成为“HEAD”修订版 .
添加所需的本地更改 . 完成;)
git push -f origin HEAD^:master
这应该“撤消”推动 .
保留分支和合并结构对于在执行rebase时使用 --preserve-merges 选项很重要:
--preserve-merges
git rebase --preserve-merges -i HEAD^^
添加/删除文件以获得您想要的方式:
git rm classdir git add sourcedir
然后修改提交:
git commit --amend
之前的错误提交将被编辑为反映新的指数状态 - 换句话说,就像你从来没有犯过错误一样
请注意,只有在尚未推送的情况下才应执行此操作 . 如果你已推,那么你只需要正常提交修复 .
如果它只是一个错误(也许你分叉一个回购,然后最终推到原来而不是一个新的),一个简单的还原,这是另一种可能性:
git reset --hard 71c27777543ccfcb0376dcdd8f6777df055ef479
显然,将该数字换成您想要返回的提交数 .
再次按下后,一切都会被删除 . 为此,下一步将是:
git push --force
git log 找出要还原的提交
git log
git push origin +7f6d03:master 而7f6d03是错误推送提交之前的提交 . + 是 force push
+
force push
就是这样 .
Here是一个非常好的指南,可以解决您的问题,简单易行!
请注意,如果要删除的提交是最后提交的提交,则此解决方案有效 .
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>" .
21 回答
要从远程存储库中删除提交:
为了从本地存储库中删除提交:
link
对于GitHub - 重置您的本地仓库中的提交(HARD)并创建一个新分支 . 推新 . 删除OLD分支 . (如果要删除主分支,请将新分支作为默认分支)
您需要清除缓存以完全擦除它 . 这个来自git的帮助页面可以帮到你 . (它帮助了我)http://help.github.com/remove-sensitive-data/
删除最近的提交,保留您已完成的工作:
删除最近的提交,破坏您已完成的工作:
重写历史不是很好 . 如果我们使用
git revert <commit_id>
,它会创建所述提交ID的干净反向提交 .这样,历史不会被重写,相反,每个人都知道有一个恢复 .
首先,删除本地存储库上的提交 . 您可以使用
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
.这对我有用 .
在Github上找到您想要成为分支头的提交的ref规范,并使用以下命令:
git push origin +[ref]:[branchName]
在您的情况下,如果您只想返回一个提交,请找到该提交的ref的开头,例如它是7f6d03,以及要更改的分支的名称,例如它是master,以及请执行下列操作:
git push origin +7f6d03:master
加号字符被解释为
--force
,这是必要的,因为您正在重写历史记录 .请注意,每当您提交
--force
时,您可能会重写其他人' history who merge your branch. However, if you catch the problem quickly (before anyone else merges your branch), you won' t有任何问题 .在终端上运行此命令 .
您可以从本地仓库删除最后n次提交,例如HEAD〜2 . 在您的存储库上继续强制git push .
希望这可以帮助!
使用
git revert
恢复推送 .还原相关修补程序引入的更改,并记录一些记录它们的新提交 . 这需要您的工作树是干净的(没有HEAD提交的修改) .
在GitHub Desktop中,您可以右键单击提交并将其还原,这将创建一个撤消更改的新提交 .
意外提交仍将在您的历史记录中(例如,如果您不小心提交了API密钥或密码,则可能会出现问题)但代码将被还原 .
这是最简单和最简单的选择,接受的答案更全面 .
If you are doing this because you have sensitive data in a commit, using the other answers here is not safe (除了subutux 's, which I' ll展开) .
github guide on this建议使用外部工具,但我更喜欢使用内置工具 .
首先, make a backup of your repository . 然后:
在此之后, make sure the repository is in the state you want . 您可能想要对备份进行区分 .
如果您确定它是正确的,那么:
您可能希望保留本地备份一段时间,以防万一 .
您需要知道要恢复的提交中的提交哈希 . 你可以从GitHub网址获取它,如:https://github.com/your-organization/your-project/commits/master
假设提交的哈希值(你要返回的地方)是“99fb454”(长版本“99fb45413eb9ca4b3063e07b40402b136a8cf264”),那么你所要做的就是:
如果你想删除做交互式rebase,
git rebase -i HEAD~4
4 represents total number of commits to display count your commit and
相应地改变它并从列表中删除您想要的提交...
保存更改 Ctrl+X(ubuntu) 或 :wq(centos)
第二种方法,做还原,
这将恢复特定的提交
首先将本地更改保存在某处(备份)
您可以浏览最近的提交,然后通过单击“复制完整的SHA”按钮将其发送到剪贴板来选择提交哈希 .
如果您最后一次提交哈希值,那么就说g0834hg304gh3084gh(例如)
你必须运行:
git push origin +g0834hg304gh3084gh:master
使用您之前复制的哈希使其成为“HEAD”修订版 .
添加所需的本地更改 . 完成;)
这应该“撤消”推动 .
保留分支和合并结构对于在执行rebase时使用
--preserve-merges
选项很重要:添加/删除文件以获得您想要的方式:
然后修改提交:
之前的错误提交将被编辑为反映新的指数状态 - 换句话说,就像你从来没有犯过错误一样
请注意,只有在尚未推送的情况下才应执行此操作 . 如果你已推,那么你只需要正常提交修复 .
如果它只是一个错误(也许你分叉一个回购,然后最终推到原来而不是一个新的),一个简单的还原,这是另一种可能性:
显然,将该数字换成您想要返回的提交数 .
再次按下后,一切都会被删除 . 为此,下一步将是:
git log
找出要还原的提交git push origin +7f6d03:master
而7f6d03是错误推送提交之前的提交 .+
是force push
就是这样 .
Here是一个非常好的指南,可以解决您的问题,简单易行!
如果您希望在删除后保留提交更改:
请注意,如果要删除的提交是最后提交的提交,则此解决方案有效 .
1 - 复制您喜欢的提交引用从日志中返回:
2 - 将git重置为提交引用:
3 - 存储/存储来自错误提交的本地更改,以便在推送到远程后使用:
4 - 将更改推送到远程存储库(-f或--force):
5 - 将存储的更改恢复到本地存储库:
7 - 如果您在更改中有未跟踪/新文件,则需要在提交之前将它们添加到git:
6 - 添加您需要的任何额外更改,然后提交所需的文件,(或使用点' . '而不是声明每个文件名,以提交本地存储库中的所有文件:
要么