撤消'git push'

Cyr*_*rus 546 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
Run Code Online (Sandbox Code Playgroud)

这是我后来意识到的一个错误.我想撤消整个过程,并将alpha-0.3.0分支恢复到原来的状态.

我该怎么办?

CB *_*ley 866

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

然后你需要'强制'推送旧的参考.

git push -f origin last_known_good_commit:branch_name
Run Code Online (Sandbox Code Playgroud)

或者在你的情况下

git push -f origin cc4b63bebb6:alpha-0.3.0
Run Code Online (Sandbox Code Playgroud)

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

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

git push origin :alpha-0.3.0
git push origin cc4b63bebb6:refs/heads/alpha-0.3.0
Run Code Online (Sandbox Code Playgroud)

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

git update-ref refs/heads/alpha-0.3.0 cc4b63bebb6 83c9191dea8
Run Code Online (Sandbox Code Playgroud)

  • 为了快速参考,这里的第一行是`git push -f origin last_known_good_commit:branch_name` (138认同)
  • 如果您在共享仓库中工作,此解决方案非常危险.作为最佳实践,推送到共享的远程仓库的所有提交应被视为"不可变".请改用"git revert":http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#fixing-mistakes (22认同)
  • 一个完美且解释清楚的回复 - 非常感谢你.对于那些偶然遇到这种情况的人来说,出于学术原因,我尝试了前两种方法,并且两种方法都有效 - 显然如果第一种方法有效,那么这是最干净的方法.如果我把你好十倍于查尔斯,我愿意.:) (15认同)
  • git push -f origin cc4b63bebb6:alpha-0.3.0 =>这个帮助了我,注意alpha-0.3.0是分支名称,cc4b63bebb6是我们希望恢复的提交ID.所以,执行此命令后,我们将在cc4b63bebb6提交id. (5认同)
  • 这真的很复杂而且困难吗?为什么有人使用这个工具.... (3认同)
  • jww - 与其他所有工具相比,git 是可用的功能最丰富、最高效的源代码控制工具。每个团队都以不同的方式使用它。值得花一个周末玩一个新的存储库并浏览所有常见的场景。一旦你花了一些时间使用它,开发的压力就会小很多。 (2认同)
  • 如果别人取了怎么办? (2认同)
  • 忘记提及这一点,您会在此过程中失去任何本地工作。我错误地将一些更改推送到了错误的分支 git push -f 做了一些更改并丢失了我以前的本地更改 :p 谢谢 IntelliJ 的本地历史功能救了我的屁股 :p (2认同)

Ben*_*ong 148

我相信你也可以这样做:

git checkout alpha-0.3.0
git reset --hard cc4b63bebb6
git push origin +alpha-0.3.0
Run Code Online (Sandbox Code Playgroud)

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

  • 这对我也有用,但值得注意的是,这将在遥控器上"重写"历史.这可能是你想要的,但可能不是! (9认同)
  • "git push origin + alpha-0.3.0"中的+是什么? (7认同)
  • 这个答案的+1真的帮助了我.我还想添加(并清楚地说明)提交ID(位于"--hard`"参数之后)应该是您要将分支重置为的任何提交的ID. (3认同)
  • @jpierson `+` 强制推送发生,类似于 `-f`(但略有不同:/sf/answers/1815648341/)。没有它,如果你尝试`git push origin alpha-0.3.0`,推送将失败:`更新被拒绝,因为你当前分支的提示在后面`。 (2认同)

neo*_*eye 93

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>
Run Code Online (Sandbox Code Playgroud)

用您自己的提交替换35f6af6f77f116ef922e3d75bc80a4a466f92650.

  • 我如何提出35f6af6f77f116ef922e3d75bc80a4a466f92650 ID?如果你能解释一下,这个答案会更好. (2认同)
  • @Volomike(以及未来的Google搜索开发人员),此问题描述了获得它的许多方法:[SO上的版本控制和哈希问题](http://stackoverflow.com/questions/949314/how-to-retrieve-the-哈希当前提交的git) (2认同)

小智 37

git reset --hard HEAD^
git push origin -f
Run Code Online (Sandbox Code Playgroud)

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


Sab*_*osh 35

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

  • 您所开的处方到底是什么?您似乎只有旧链接。 (2认同)

cur*_*mil 29

一种方法,而不会丢失您想要的更改:

git reset cc4b63b 
git stash
git push -f origin alpha-0.3.0
git stash pop
Run Code Online (Sandbox Code Playgroud)

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


Rus*_*hta 18

另一种方法:

  1. 创建另一个分支
  2. 使用"git checkout"检出该分支上的上一次提交
  3. 推新分支.
  4. 删除旧分支并推送删除(使用git push origin --delete <branch_name>)
  5. 将新分支重命名为旧分支
  6. 再推一次.

  • 当你在repo中提交错误时,这个看起来像是一个真正的解决方案 (2认同)

小智 14

git push origin +7f6d03:master
Run Code Online (Sandbox Code Playgroud)

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

  • 这是最直接的答案。您是个救星。 (2认同)
  • 请记住,那不会重置您的本地文件。 (2认同)

Jay*_*min 10

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

撤消上次提交

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


Bar*_*i r 8

场景1:如果要撤消上次提交,请说8123b7e04b3,下面是命令(这对我有用):

git push origin +8123b7e04b3^:<branch_name>
Run Code Online (Sandbox Code Playgroud)

输出如下所示:

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

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

git reset --hard 8123b7e04b3
Run Code Online (Sandbox Code Playgroud)

输出:

HEAD is now at cc6206c Comment_that_was_entered_for_commit
Run Code Online (Sandbox Code Playgroud)

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


小智 7

您可以使用命令重置

git reset --soft HEAD^1
Run Code Online (Sandbox Code Playgroud)

然后:

git reset <files>
git commit --amend
Run Code Online (Sandbox Code Playgroud)

git push -f
Run Code Online (Sandbox Code Playgroud)