撤消'git push'
这就是我在我应该稳定的分支上做的事情
% git rebase master First, rewinding head to replay your work on top of it... Fast-forwarded alpha-0.3.0 to master. % git status # On branch alpha-0.3.0 # Your branch is ahead of 'origin/alpha-0.3.0' by 53 commits. # nothing to commit (working directory clean) % git push Fetching remote heads... refs/ refs/heads/ refs/tags/ refs/remotes/ 'refs/heads/master': up-to-date updating 'refs/heads/alpha-0.3.0' from cc4b63bebb6e6dd04407f8788938244b78c50285 to 83c9191dea88d146400853af5eb7555f252001b0 done 'refs/heads/unstable': up-to-date Updating remote server info
我后来意识到这是一个错误。 我想撤销整个过程,并将alpha-0.3.0分支恢复到原来的状态。
我该怎么办?
您需要确保此存储库的其他用户没有提取不正确的更改,或者尝试在您要删除的提交之上构build,因为您将要倒退历史logging。
那么你需要“强制”推送旧的参考。
git push -f origin last_known_good_commit:branch_name
或在你的情况
git push -f origin cc4b63bebb6:alpha-0.3.0
您可能在远程存储库上设置了receive.denyNonFastForwards
。 如果是这样的话,你会得到一个错误,包括短语[remote rejected]
。
在这种情况下,您将不得不删除并重新创build分支。
git push origin :alpha-0.3.0 git push origin cc4b63bebb6:refs/heads/alpha-0.3.0
如果这不起作用 – 也许是因为你有receive.denyDeletes
设置,那么你必须有直接访问存储库。 在远程存储库中,您必须执行类似以下pipe道命令的操作。
git update-ref refs/heads/alpha-0.3.0 cc4b63bebb6 83c9191dea8
我相信你也可以这样做:
git checkout alpha-0.3.0 git reset --hard cc4b63bebb6 git push origin +alpha-0.3.0
这与最后一种方法非常相似,除非您不必在远程回购中混淆。
git revert
比一些在这里build议的方法更不危险:
prompt> git revert 35f6af6f77f116ef922e3d75bc80a4a466f92650 [master 71738a9] Revert "Issue #482 - Fixed bug." 4 files changed, 30 insertions(+), 42 deletions(-) prompt> git status # On branch master # Your branch is ahead of 'origin/master' by 1 commit. # nothing to commit (working directory clean) prompt>
用你自己的提交replace35f6af6f77f116ef922e3d75bc80a4a466f92650。
如果你在一个共享库中工作,被接受的解决scheme(来自@charles bailey)是非常危险的。
作为一个最佳实践,所有提交到共享的远程仓库的提交应该被认为是“不可变的”。 使用'git revert'代替: http : //www.kernel.org/pub/software/scm/git/docs/user-manual.html#fixing-mistakes
一种方法来做到这一点,而不会失去你想要的变化:
git reset cc4b63b git stash git push -f origin alpha-0.3.0 git stash pop
然后你可以select你想要推送的文件
另一种方法来做到这一点:
- 创build另一个分支
- 使用“git checkout”签出前一个提交的分支
- 推新的分支。
- 删除旧分支&推删除(使用
git push origin --delete <branch_name>
) - 将新分支重命名为旧分支
- 再推一次。
git push origin +7f6d03:master
这将恢复您的回购提到提交号码
撤消多个提交git reset –hard 0ad5a7a6(只要提供提交SHA1哈希)
撤消上次提交
git reset –hard HEAD〜1(对上次提交的更改将被删除)git reset –soft HEAD〜1(对上次提交的更改将作为无限制的本地修改提供)
这将删除远程分支(主分支或分支)中最后一次推送的提交:
git push origin +HEAD^:master