这是我在我应该稳定的树枝上做的事情……

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

我该怎么办?


您需要确保这个存储库的其他用户没有获取不正确的更改,或者试图在您希望删除的提交之上构建,因为您要倒带历史记录。

然后你需要“强制”推旧的引用。

git push -f origin last_known_good_commit:branch_name

或者在你的情况下

git push -f origin cc4b63bebb6:alpha-0.3.0

您可能已经在远程存储库上设置了receive. denynonfastforward。如果是这种情况,那么您将得到一个包含短语[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

我相信你也可以这样做:

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

这与最后一个方法非常相似,只是您不必在远程回购中浪费时间。


如果您在共享回购中工作,那么公认的解决方案(来自@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 Checkout”在该分支上签出之前的提交 推新树枝。 删除旧的分支并推送删除(使用git push origin——Delete <branch_name>) 将新分支重命名为旧分支 推动了。


一种不丢失你想要的更改的方法:

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

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


Git恢复比这里建议的一些方法更安全:

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。


git push origin +7f6d03:master

这将恢复您的回购到提到的提交编号


撤销多次提交 git reset——hard 0ad5a7a6(只提供提交SHA1哈希)

撤消上次提交

git reset—soft HEAD~1(对最后一次提交的修改将被删除)


如果你想忽略你刚刚在远程分支中推送的最后一个提交:这不会删除提交,而是通过将git指针移动到之前的提交(由HEAD^或HEAD^1引用)来忽略它

git push origin +HEAD^:branch

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

git revert <SHA-1>
git push origin branch

场景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


现有的答案是正确的,但是如果你需要撤消推送,但是:

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

使用此命令将更改还原为ref:

git push -f origin refs/remotes/origin/<branch>@{1}:<branch>

可以使用reset命令

git reset --soft HEAD^1

然后:

git reset <files>
git commit --amend

and

git push -f

git reset --hard HEAD^
git push origin -f

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


要恢复推送

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

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

git reset --hard origin/master

或者另一种方式

要重置推送:git reset -soft HEAD^1 将出现修改文件,所以重置它们:git重置<文件> Git提交—修改 Git push -f


我也有同样的问题。我只是复制了我想要恢复的最后一个提交id(af12de…)。然后执行以下命令 Git回复af12de....然后将我的更改推送到主服务器。这对我很有效