撤消'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

https://git-scm.com/book/be/v2/Git-Basics-Undoing-Things

一种方法来做到这一点,而不会失去你想要的变化:

 git reset cc4b63b git stash git push -f origin alpha-0.3.0 git stash pop 

然后你可以select你想要推送的文件

另一种方法来做到这一点:

  1. 创build另一个分支
  2. 使用“git checkout”签出前一个提交的分支
  3. 推新的分支。
  4. 删除旧分支&推删除(使用git push origin --delete <branch_name>
  5. 将新分支重命名为旧分支
  6. 再推一次。
 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