722

这是我在我应该是稳定的分支上所做的......

% 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 分支恢复到原来的样子。

我该怎么办?

4

15 回答 15

1143

您需要确保此存储库的其他用户没有获取不正确的更改或尝试在您想要删除的提交之上构建,因为您即将回滚历史记录。

然后你需要“强制”推送旧的参考。

git push -f origin last_known_good_commit:branch_name

或者在你的情况下

git push -f origin cc4b63bebb6:alpha-0.3.0

您可能已经receive.denyNonFastForwards在远程存储库上进行了设置。如果是这种情况,那么您将收到包含短语的错误[remote rejected]

在这种情况下,您将不得不删除并重新创建分支。

git push origin :alpha-0.3.0
git push origin cc4b63bebb6:refs/heads/alpha-0.3.0

如果这不起作用 - 可能是因为您已receive.denyDeletes设置,那么您必须直接访问存储库。在远程存储库中,您必须执行类似以下管道命令的操作。

git update-ref refs/heads/alpha-0.3.0 cc4b63bebb6 83c9191dea8
于 2009-08-13T07:47:35.643 回答
194

我相信你也可以这样做:

git checkout alpha-0.3.0
git reset --hard cc4b63bebb6
git push origin +alpha-0.3.0

这与最后一种方法非常相似,只是您不必在远程仓库中乱搞。

于 2009-11-24T16:48:49.483 回答
122

git revert比这里建议的一些方法危险性小:

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>

将 35f6af6f77f116ef922e3d75bc80a4a466f92650 替换为您自己的提交。

于 2012-09-03T11:39:14.517 回答
46

一种在不丢失您想要的更改的情况下执行此操作的方法:

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

然后你可以选择你要推送的文件

于 2011-11-12T00:04:37.577 回答
37

如果您在共享存储库中工作,接受的解决方案(来自@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

于 2011-02-24T02:31:21.677 回答
28
git push origin +7f6d03:master

这会将您的仓库恢复为提到的提交号

于 2017-01-23T07:52:01.390 回答
23

另一种方法:

  1. 创建另一个分支
  2. 使用“git checkout”签出该分支上的先前提交
  3. 推新分支。
  4. 删除旧分支并推送删除(使用git push origin --delete <branch_name>
  5. 将新分支重命名为旧分支
  6. 再推。
于 2011-07-25T11:24:33.937 回答
15

撤消多个提交 git reset --hard 0ad5a7a6(只需提供提交 SHA1 哈希)

撤消上次提交

git reset --hard HEAD~1(对上次提交的更改将被删除) git reset --soft HEAD~1(对上次提交的更改将作为未提交的本地修改提供)

于 2017-05-12T06:40:21.800 回答
13

场景1:如果你想撤销最后一次提交说8123b7e04b3,下面是命令(这对我有用):

git push origin +8123b7e04b3^:<branch_name>

输出如下所示:

Total 0 (delta 0), reused 0 (delta 0)
To https://testlocation/code.git
 + 8123b7e...92bc500 8123b7e04b3^ -> master (forced update)

注意:要更新对本地代码的更改(也可以在本地删除提交):

$ git reset --hard origin/<branchName>
Message displayed is :    HEAD is now at 8a3902a comments_entered_for_commit

附加信息: 场景2:在某些情况下,您可能希望通过上一个命令恢复刚刚撤消的内容(基本上撤消撤消),然后使用以下命令:

git reset --hard 8123b7e04b3
git push

输出:

HEAD is now at cc6206c Comment_that_was_entered_for_commit

更多信息:https ://github.com/blog/2019-how-to-undo-almost-anything-with-git

于 2017-12-19T12:02:38.383 回答
5

你可以使用命令reset

git reset --soft HEAD^1

然后:

git reset <files>
git commit --amend

git push -f
于 2020-06-17T18:05:15.363 回答
5
git reset --hard HEAD^
git push origin -f

这将从您的本地设备以及 Github 中删除最后一次提交

于 2021-01-27T19:28:48.430 回答
0

现有的答案是好的和正确的,但是如果你需要撤消push但是:

  1. 您希望将提交保留在本地,或者您希望保留未提交的更改
  2. 你不知道你刚刚推送了多少次提交

使用此命令恢复对 ref 的更改:

git push -f origin refs/remotes/origin/<branch>@{1}:<branch>
于 2019-09-19T17:57:12.627 回答
0

恢复推送

git reset --hard HEAD@{1}
git push -f
git reset --hard HEAD@{1}

现在您的本地将领先于远程

git reset --hard origin/master

或替代方式

  1. 重置推送:git reset --soft HEAD^1

  2. 将出现修改文件,因此重置它们:git reset <files>

  3. git commit --amend

  4. git 推送 -f

于 2021-10-23T00:28:05.170 回答
0

使用 gitlab 的人有一个名为“options”的按钮,其中包含“revert”。

于 2022-02-24T12:20:41.437 回答
-2

如果您想忽略刚刚在远程分支中推送的最后一次提交:这不会删除该提交,而只是通过将 移至git pointer更早的提交来忽略它,由HEAD^or引用HEAD^1

git push origin +HEAD^:branch

但是如果你已经推送了这个提交,而其他人已经拉了这个分支。在这种情况下,重写你的分支的历史是不可取的,你应该恢复它commit

git revert <SHA-1>
git push origin branch
于 2017-06-22T13:22:15.953 回答