撤消'git push'

时间:2009-08-13 07:23:50

标签: git 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分支恢复到原来的状态。

我该怎么办?

13 个答案:

答案 0 :(得分:830)

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

然后你需要'强制'推送旧的参考文献。

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

答案 1 :(得分:141)

我相信你也可以这样做:

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

这与上一个方法非常相似,只是你不必在远程仓库中捣乱。

答案 2 :(得分:86)

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替换为您自己的提交。

答案 3 :(得分:32)

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

答案 4 :(得分:28)

一种方法,可以在不丢失所需更改的情况下执行此操作:

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

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

答案 5 :(得分:17)

另一种方法:

  1. 创建另一个分支
  2. 使用“git checkout”
  3. 结帐该分支上的上一次提交
  4. 推新分支。
  5. 删除旧分支&amp;推送删除(使用git push origin --delete <branch_name>
  6. 将新分支重命名为旧分支
  7. 再次推。

答案 6 :(得分:11)

CAShapeLayer

这会将您的回购还原为提及的提交编号

答案 7 :(得分:9)

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

撤消上次提交

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

答案 8 :(得分:6)

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

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

git reset --hard 8123b7e04b3

输出:

HEAD is now at cc6206c Comment_that_was_entered_for_commit

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

答案 9 :(得分:2)

您可以使用命令reset

git reset --soft HEAD^1

然后:

git reset <files>
git commit --amend

git push -f

答案 10 :(得分:2)

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

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

答案 11 :(得分:0)

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

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

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

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

答案 12 :(得分:-2)

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

git push origin +HEAD^:branch

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

git revert <SHA-1>
git push origin branch