如何在`git push`之后在本地和远程上撤消`git commit`

mic*_*ael 226 git git-push git-commit

我演出git commit后跟着一个git push.如何在本地和远程存储库上还原该更改?

$ git log
commit 364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8
Author: Michael Silver <Michael Silver@gmail.com>
Date:   Tue Jun 11 12:24:23 2011 -0700
Run Code Online (Sandbox Code Playgroud)

Ale*_*roß 377

git reset --hard HEAD~1
git push -f <remote> <branch>
Run Code Online (Sandbox Code Playgroud)

(实施例推: git push -f origin bugfix/bug123)

这将撤消上次提交并将更新的历史记录推送到远程.您需要传递,-f因为您正在替换远程中的上游历史记录.

  • 另外,要小心 - 如果其他人从回购中撤出,你不应该这样做AFAIK. (25认同)
  • 或者,使用`git reset --hard <the-sha-you-want-to-return-to>. (24认同)
  • 如果您不希望所做的更改(未分级的更改),则使用git reset HEAD〜1。更改,提交并再次推送`git push -f [origin] [branch]` (3认同)
  • 该引用称为HEAD(区分大小写) (2认同)

Ama*_*dan 153

通常,使用以下命令进行"反向"提交:

git revert 364705c
Run Code Online (Sandbox Code Playgroud)

然后像往常一样将它发送到遥控器:

git push
Run Code Online (Sandbox Code Playgroud)

这不会删除提交:它会进行额外的提交,撤消第一次提交所做的任何操作.其他任何东西,都不是很安全,特别是当变化已经传播时.

  • @JosueIbarra我不同意所有情况.对于大多数情况,是的,您不应该覆盖历史记录.但是,我相信有绝对应该的合法案例.例如,您不小心提交并推送了您的秘密文件.这不应该在git repo中出现.因此,您可以使用此处接受的答案快速删除它. (17认同)
  • @bfcoder如果你把一个"秘密"推送到一个远程仓库,它就不再是秘密了.正确的解决方法是创建一个新的秘密,而不是试图隐藏你的错误. (9认同)
  • 这比AlexanderGroß(选择的答案)更安全(因此可能更好). (8认同)
  • @Graeck每一个解决方案都有其含义和优点. (6认同)
  • 这应该是公认的答案,最好不要覆盖历史记录,如果与团队合作则更多.只有在尚未将更改推送到服务器时才会接受`git reset`. (4认同)

kmo*_*oor 37

首先,放松一下.

"没有什么是在我们的控制之下.我们的控制仅仅是幻觉.","犯错误就是人"

我知道你无意中将代码推送到了remote-master.这样就好了.

1.首先,获取SHA-1您尝试返回的提交的值,例如,提交到master分支.运行这个:

git log
Run Code Online (Sandbox Code Playgroud)

你会看到一堆'f650a9e398ad9ca606b25513bd​​4af9fe ......'和每个提交一样的字符串.从要返回的提交中复制该数字.

2.现在,输入以下命令:

git reset --hard your_that_copied_string_but_without_quote_mark
Run Code Online (Sandbox Code Playgroud)

你应该看到像"HEAD现在在"的消息.你很清楚.它刚刚做的是在本地反映这种变化.

3.现在,输入以下命令:

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

你应该看到像

"警告:push.default未设置;其隐含值已更改......总计0(增量0),重用0(增量0)...... ... your_branch_name - >主(强制更新) ".

现在,你们都清楚了.再次使用"git log"检查master,你的fixed_destination_commit应该在列表的顶部.

欢迎您(提前;))

更新:

现在,在所有这些开始之前你所做的改变现在已经消失了. 如果你想再次带回那些艰苦的工作,那就有可能.感谢git refloggit cherry-pick命令.

为此,我建议请关注此博客此帖.

  • 喜欢报价:) (4认同)

sof*_*var 8

git reset HEAD~1如果您不希望更改消失(未分级更改).更改,提交并再次推送git push -f [origin] [branch]


Moh*_*wan 7

尝试使用

git reset --hard <commit id> 
Run Code Online (Sandbox Code Playgroud)

请注意:这里的提交 ID 是您想要转到的提交的 ID,而不是您想要重置的 ID。这是我也陷入困境的唯一一点。

然后推

git push -f <remote> <branch>
Run Code Online (Sandbox Code Playgroud)